第5次文章:關於IO流的基本操作

  • 2019 年 10 月 8 日
  • 筆記

春節假期就要結束啦,很多小夥伴兒明天就開始上班了,祝各位小夥伴兒新的一年工作順心,萬事順利喲!

本周學習了關於Java中的IO流,IO流中有許多基本的操作方法,此處不便於列舉,我們使用三個具體的程式,順帶的整理一下本周的學習情況!

實例一:輸出所選文件夾中的所有文件名,包含子孫級文件名

public class Demo05 {      public static void main(String[] args) {          String path = "C:\documents\java\公眾號運營";          File src = new File(path);//創建File對象          printName(src);      }      //使用迭代進行輸出      public static void printName(File src) {          if (null==src||!src.exists()) {//如果為空或者不存在,則直接退出              return;          }          System.out.println(src.getAbsolutePath());//輸出絕對路徑          if(src.isDirectory()) {//判斷是否為目錄              File[] files = src.listFiles();//以file對象的方式,列舉目錄下的所有文件及文件夾              for(File temp:files) {                  printName(temp);//迭代每一個file對象              }          }      }  }

下面對這段程式碼中的一些細節進行分析:

1、分隔符

在Java中,路徑分隔符(;)使用常量:File.pathSeparator,名稱分隔符(「/」或「」)使用常量:File.separator。尤其需要注意名稱分隔符,在Windows中,名稱分隔符使用斜杠「」,在Linux以及其他系統中,名稱分隔符使用反斜杠「/」。由於在程式編寫和使用時,經常會出現在不同的系統中,所以使用分隔符的時候,建議使用常量:File.separator,Java會根據具體環境,進行匹配。

在上面的程式碼中,第一行路徑中出現了「\」,這是因為Java中的「」屬於轉義字元,比如「t」就代表製表符「tab」鍵,所以在使用單斜杠的時候,需要在其前面多加一個單斜杠。

2、File對象的創建

File對象的創建可以利用絕對路徑和相對路徑進行創建。上面的程式碼中使用的是絕對路徑,當我們使用相對路徑的時候,Java會默認當前工作空間user.dir為根路徑。在創建File對象的時候,僅僅是將路徑和File類型的新變數進行了一定的聯繫,並不會關注其到底有沒有真實的存在路徑中的文件。

3、關於File的一些基本方法

exist:檢查此File對象是否真實的存在。

getAbsolutePath:獲取File對象的絕對路徑。

getParent:返回File對象的上一級目錄。

getName:返回File對象的名稱。

isFile:判斷其File對象是否是文件。

isDirectory:判斷File對象是否是目錄。

list:將File對象的目錄,以字元串數組的形式返回

listFiles:將File對象的目錄,以File數組的形式進行返回

實例二:文件的讀取

文件的讀取有四個基本步驟:

1、建立聯繫 File對象

2、選擇流:輸入流InputStream + FileInputStream

3、讀取數據,操作流對象:byte[] car = new byte[10]+read方法

4、釋放資源:關閉

public class Demo01 {      public static void main(String[] args) {          //1、建立聯繫File對象          File src = new File("C:\documents\test\abc.txt\ABC.txt");          //2、選擇流          InputStream is = null;//提升作用域          try {              is = new FileInputStream(src);              //3、操作 不斷讀取 緩衝數組              byte[] car = new byte[10];              int len=0;//接收 實際讀取的大小              //循環讀取              while(-1!=(len=is.read(car))) {//將實際讀取到的數量返回給len,當讀取結束時,返回len=-1                  //輸出 位元組數組轉換為字元串                  String info = new String(car,0,len);                  System.out.println(info);              }          } catch (FileNotFoundException e) {              e.printStackTrace();              System.out.println("文件不存在");          } catch (IOException e) {              e.printStackTrace();              System.out.println("文件讀取失敗");          }finally {              //4、釋放資源              if(null!=is) {                  try {                      is.close();                  } catch (IOException e) {                      e.printStackTrace();                      System.out.println("關閉文件輸入流失敗");                  }              }          }      }  }

上面的這段程式碼中,有幾個小技巧比較有用,所以來提一下:

1、在第2步選擇流的時候,我們讀取外部文件,選擇輸入流InputStream。輸入流的使用需要和電腦的操作文件進行交互,所以需要捕獲異常,而捕獲異常的時候,會將輸入流的申明放入程式碼段try{}中,成為了此程式碼段的一個局部變數,這樣將不利於我們後續在程式碼段finally{}中釋放資源。所以我們將輸入流InputStream的申明放在try{}的外部,提升作用域,然後在程式碼段try{}中進行讀取操作。

2、在使用輸入流的時候,讀取是使用位元組數組「byte[]」進行讀取,所以當我們需要進行臨時的查看時,不能直接對讀出來的位元組進行查看,而是使用了「String info = new String(car,0,len);」將讀取出來的位元組數組轉化成了字元串,然後再進行查看讀取的內容。

3、在捕獲異常的時候,為了後續的檢查方便,一定要在每個catch中,添加報錯的原因,否則,程式碼運行一旦報錯,很難快速定位到報錯的原因上,浪費大量時間。

實例三:文件的寫出

主要步驟與文件的讀入相差不多,也分為4步:

1、建立聯繫 File對象

2、選擇流:輸出流 OutputStream + FileOutputStream

3、讀取數據,操作流對象:write()+flush

4、釋放資源:關閉

public class Demo02 {      public static void main(String[] args) {          //1、建立聯繫 File對象          String path = "C:\documents\test\abc.txt\ABC.txt";          File dest = new File(path);          //2、選擇流:          OutputStream os = null;//提升作用域          try {              //以追加的形式寫入文件,選擇true,否則是以覆蓋的形式寫入文件,默認為false              //FileOutputStream(File file, boolean append)              os = new FileOutputStream(dest,true);              //3、寫出數據              String str = "peng is very good rn";              //寫出時注意將字元串轉換為位元組流              byte[] car = str.getBytes();              //將位元組流寫出到目標文件              os.write(car, 0, car.length);              os.flush();//強制刷新出去          } catch (FileNotFoundException e) {              e.printStackTrace();              System.out.println("文件不存在");          } catch (IOException e) {              e.printStackTrace();              System.out.println("寫出時失敗");          }finally {              if(null!=os) {                  try {                      os.close();                  } catch (IOException e) {                      e.printStackTrace();                      System.out.println("關閉輸出流文件失敗");                  }              }          }      }  }

對文件的寫出,與文件讀入操作基本一致,這裡提一個程式碼中的寫出函數:FileOutputStream(File file, boolean append),當我們在使用輸出流函數FileOutputStream時,如果沒有將append參數設置為true,則文件寫出的時候,將會以覆蓋的方式輸出到文件。比如,在這段程式碼中,我們向文件「ABC.txt」中寫入字元串數據「peng is very good」,我們將append設置的是true(追加的形式寫出),字元串數據不會覆蓋「ABC.txt」文件中的原始數據,而是直接在目標文件的後面直接加入字元串「peng is very good」。如果我們將append參數設置為false,或者使用默認值,那麼寫出的方式將會是「覆蓋」,直接將原文件中的所有數據清空,只寫入這一個字元串數據「peng is very good」。

Tags: