字符流,讀取的文件是字符的時候,有兩個基類一個是Reader,一個是Writer這有點擬人的感受,人直接看懂的是文字數組
字節流:讀取的是文件中的二進制字節流並不會幫你轉換成看的懂得字符函數
字符流:字符流會把讀到的二進制的數據進行對應的編碼解碼工做。 字符流 = 字節流+編碼(解碼)編碼
輸入字符流
Reader 輸入字符流的基類 抽象類spa
|——FileReader 讀取文件的輸入字符流設計
1、找到目標文件code
2、創建數據的輸入通道視頻
3、讀取數據blog
4、關閉資源圖片
FileWriter的使用注意事項資源
1、FileWriter寫數據的時候,FileWriter內部維護了一個1024個字節的數組,寫數據的時候,會先寫入到它內部維護的字符數組,若是須要把數據真正寫到硬盤上,須要調用flush方法
或者close方法或者內部數組存滿時,纔會把緩衝數組中的內容寫入到硬盤。
2、使用FileWriter的時候,若是目標文件不錯在會自動建立文件,
3、若是目標文件已存在,默認狀況會先清空文件中的數據,在寫入數據,若是須要在原來的基礎上追加數據。須要舒勇構造函數
new FileWriter(file, true)
使用字符流拷貝圖片會致使圖片數據丟失,圖片變小,而沒法顯示。
FileReader默認的是gbk編碼,gbk是兩個字節共可表示65536個字符,可是並不是一共這麼多的碼子,有些是空的沒法表示。
每當reader從圖片中讀取到的數據會先到碼錶中找映射到的字符,可是有些是沒有字符映射的,那麼會返回一個未知字符對應的
數字,而爲之字符佔一個字節。這樣就致使了數據的丟失。
使用字符流拷貝文本文件:
1 public static void copyText() throws IOException 2 { 3 //找到目標文件 4 File inFile = new File("E:\\ebook\\海邊的卡夫卡.txt"); 5 File outFile = new File("D:\\海邊的卡夫卡副本.txt"); 6 //創建數據通道 7 FileReader fileReader = new FileReader(inFile); 8 FileWriter fileWriter = new FileWriter(outFile); 9 //創建緩衝字符數組 10 int length = 0; 11 int wordCount = 0; 12 char[] buf = new char[1024]; 13 while((length = fileReader.read(buf))!=-1) 14 { 15 wordCount += length; 16 fileWriter.write(buf, 0, length); 17 } 18 fileWriter.close(); 19 fileReader.close(); 20 System.out.println("wordCount = "+wordCount); 21 }
什麼時候使用字符流,什麼時候使用字節流?依據是什麼?
使用字符流的應用場景?
若是是讀寫字符數據的時候,好比你看到到的abcd日月水火等
字節流的應用場景?
若是讀寫的數據都不須要轉換成字符的時候好比聲音文字視頻,則使用字節流。
輸入字符流
Reader 輸入字符流的基類 抽象類
|——FileReader 讀取文件的字符流
|——BufferedReder 緩衝輸入字符流,爲了提升侮辱數據的效率和擴張了FileReader的功能。
| 該類內部也是維護了一個字符數組。多了一個readLine()的方法
1、找到目標文件
2、創建數據的輸入通道
3、讀取數據
4、關閉資源
輸出字符流
Writer 全部輸出流的基類 抽象類
|——FileWriter 向文件輸出字符數據的輸出字符流
|——BufferWriter緩衝輸出字符流 緩衝輸出字符流主要做用提升FileWriter的寫數據的效率和團戰FielWriter的功能
1.找到目標文件
2、創建數據輸出通道
3、創建緩衝輸出流
4、寫出數據
5、別忘了使用flush或者close
注意:BufferedWriter類的設計稍微有一點失敗,這個類和FileWriter類的功能徹底同樣,不一樣之處在於,BufferedWriter
維護的內部緩衝數組更大一些,8kB而FileWriter類的內部緩衝數組是1kB,此外,BufferedWriter內部緩衝數組的大小可使用
構造函數來制定,neLine()寫入一個分分行符,就這麼多