第5次文章:關於IO流的基本操作
- 2019 年 10 月 8 日
- 筆記
春節假期就要結束啦,很多小夥伴兒明天就開始上班了,祝各位小夥伴兒新的一年工作順心,萬事順利喲!
實例一:輸出所選文件夾中的所有文件名,包含子孫級文件名
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」。