java成神之路——IO流
阿新 • • 發佈:2020-12-12
File類
- java.io.File類:檔案和目錄路徑的抽象表現形式,與平臺無關
- File能新建、刪除、重新命名檔案和目錄,但File不能訪問檔案內容本身,如果需要訪問檔案內容本身,則需要使用輸入輸出流。
- File物件可以作為引數傳遞給流的物件。
File類的常見構造方法
- public File(String Pathname)
以pathname為路徑建立File物件,可以是絕對路徑也可以是相對路徑,如果pathname是相對路徑,則預設當前路徑在系統屬性user.dir中儲存。 - public File(String parent,String Child)
以parent為父路徑,childe為子路徑建立File物件
public void test(){ //File fine = new File("D:\\io\\helloword.txt");//絕對路徑 //以helloword.txt為路徑建立File物件 File fiel = new File("helloword.txt");//相對路徑 //判斷物件是否存在,不存在建立物件 if(!file.exists()){ boolean b1 = file.createNewFile(); } File file3 = new File("hello"); //建立資料夾 if(file3.exists){ file3.mkdir(); } }
java IO原理
- IO流用來處理裝置之間的資料傳輸
- java程式中,對於資料的輸入、輸出操作類似以“流(stream)的方式進行。
- java.io包下提供了各類”流“類和介面,用以獲取不同的資料,並通過標準的方法輸入/輸入資料。
- 輸入:讀取外部資料(磁碟、光碟等儲存等儲存裝置的資料)到程式(記憶體)中。
- 輸出:將程式(記憶體)資料輸出到磁碟、光碟等儲存裝置中。
流的分類
- 按資料單位分為:位元組流和字元流
- 按資料流的流向不同分為:輸入流和輸出流
- 按角色的不同分為:節點流和處理流
- java的IO流設計40多個類,實際上都是從如上四個類上派生出來的
- 這四個類派生出來的子類名都是以父類名作為字尾
這裡我們主要對訪問檔案和緩衝流做詳細說明
- FileInPutStream
//從檔案中讀取內容到控制檯上
public void test(){
//1. 建立File物件
File file = new File("hello.txt");
FileInPutStream fis = null;
try{
// 2. 將File物件作為形參傳遞給InPutStream的實現類FileInPutStream的構造器中
fis = new FileInPutStream(file);
int i;
//這裡是因為read()是從輸入的流中讀取的是位元組資料,且這個方法在沒有輸入的時候會堵塞,這個方法的返回值是下一個位元組,在沒有輸入的時候返回為-1
// 3. 通過呼叫Reader方法讀取檔案中的內容
while(i = fis.read()!=-1){//判斷是否還有輸入
System.out.println((char)i);//這裡是因為返回的是位元組轉型為字元
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//4. 關閉現有的流
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
]
- FileOutPutStream
// 從指定的檔案中讀取內容
public void test1(){
File src = new File("hello.txt");
File des = new File("helloword.txt");
FIleInPutStream fis = null;
FileOutPutStream fos = null;
try{
fis = new FileInPutStream(src);
fos = new FileOutPutStream(des);
byte[] b = new byte[10];
int len;
while(len = fis.read(b)!=-1){
fos.write(b,0,len);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(fos!=null){
fos.close();
}catch(IOException e){
e.printStackTrace();
}
try{
if(fis!=null){
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
}
3 . FileReader
public void test(){
//1. 建立File物件
File file = new File("hello.txt");
FIleReader fis = null;
try{
// 2. 將File物件作為形參傳遞給InPutStream的實現類FileInPutStream的構造器中
fis = new FIleReader (file);
int i;
while(i = fis.read()!=-1){//判斷是否還有輸入
System.out.println(i);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//4. 關閉現有的流
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
]
- FileWirte
public void test1(){
File src = new File("hello.txt");
File des = new File("helloword.txt");
FIleReader fis = null;
FileWriter fos = null;
try{
fis = new FIleReader (src);
fos = new FileWriter (des);
char[] c= new char[10];
int len;
while(len = fis.read(c)!=-1){
fos.write(c,0,len);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(fos!=null){
fos.close();
}catch(IOException e){
e.printStackTrace();
}
try{
if(fis!=null){
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
}
- BufferedInPutStream 、BufferedOutPutStream
public void test1(){
File src = new File("hello.txt");
File des = new File("helloword.txt");
FIleInPutStream fis = null;
FileOutPutStream fos = null;
BufferedInPutStream bis = null;
BufferedOutPutStream bos = null;
try{
fis = new FileInPutStream(src);
fos = new FileOutPutStream(des);
bis = new BufferedInPutStram(fis);
bos = new BufferedOutPutStream(fos);
byte[] b = new byte[1024];
int len;
while(len = bis.read(b)!=-1){
bos.write(b,0,len);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(fos!=null){
bos.close();
}catch(IOException e){
e.printStackTrace();
}
try{
if(fis!=null){
bis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
}
總結:傳輸文字使用Reader 和 Writer比較快,圖片和視訊則是InputStream和UotPutStream比較快
想提升傳輸速度可以使用緩衝流bufferedInputStram和BufferedOutPutStram還可以在建立位元組陣列的時候自定位元組數多一點如 byte[] b = new byte[10] 改為byte[] b = new byte[1024] 這樣就是以10位元組讀取或則寫入提升到1024 位元組讀取或者寫入。