傳遞給字符流的字節(jié)流不需要單獨的進(jìn)行關(guān)系 , 在字符流關(guān)閉的時候會調(diào)用字節(jié)流的close()方法 。
FileWriter & FileReader
FileWriter 和 FileReader 分別是 OutputStreamWriter 和 InputStreamReader 的子類 , 只不過他們是只能操作系統(tǒng)默認(rèn)編碼表的字符流 。也可以這么簡單的理解: OutputStreamWriter 和 InputStreamReader 的構(gòu)造函數(shù)不支持傳遞第二個參數(shù) , 就是操作系統(tǒng)默認(rèn)的編碼表 。所以在使用上只需要注意操作的文件編碼格式是否與系統(tǒng)默認(rèn)的編碼格式一致即可 。既然不傳遞第二個參數(shù)就可以達(dá)到相同的效果 , 為什么還會有這個兩個類呢?因為這兩個類操作簡單 。下面還是以復(fù)制文件為例 。
File sourceFile = new File("sourceFile.txt"); File destFile = new File("destFile.txt"); FileReader reader=null;FileWriter writer=null; try {reader= new FileReader(sourceFile);writer =new FileWriter(destFile); char[] cbuf =new char[1024];int len=0;while((len=reader.read(cbuf))!=-1) { System.out.println(String.copyValueOf(cbuf,0,len));writer.write(cbuf, 0,len);} } catch(IOException ex) { } finally { try{reader.close();}catch(IOException ex) { } try{writer.close();}catch(IOException ex) { } }無論是使用 FileWriter & FileReader 還是 OutputStreamWriter & InputStreamReader , 在他們的內(nèi)部都會存在緩沖區(qū)的 , 默認(rèn)大小為8192字節(jié) 。如果不對流進(jìn)行關(guān)閉的話 , 數(shù)據(jù)會繼續(xù)存在緩沖區(qū) , 不會存儲到文件上 , 除非手動調(diào)用flush方法或者是在緩沖區(qū)中寫入的數(shù)據(jù)超過了緩沖區(qū)的大小 , 數(shù)據(jù)才會刷新到文件上 。而調(diào)用close方法的內(nèi)部會先調(diào)用flush刷新緩沖區(qū) 。
BufferedOutputStream & BufferedInputStream & BufferedWriter & BufferedReader
這四個Buffered開頭的類分別是為字節(jié)流和字符流提供一個合適的緩沖區(qū)來提高讀寫性能 , 尤其是在讀寫數(shù)據(jù)量很大的時候效果更佳顯著 。其用法和不帶Buffered的流沒有任何區(qū)別 , 只不過在不帶Buffered流的基礎(chǔ)上提供了一些更加便利的方法 , 例如newLine() , ReadLine()和ReadAllBytes() , 他們會根據(jù)操作系統(tǒng)的不同添加合適的換行符 , 根據(jù)合適的換行符來讀取一行數(shù)據(jù)和讀取所有字節(jié) 。來看一下用法以緩沖字符流為例
File sourceFile = new File("sourceFile.txt");File destFile = new File("destFile.txt");BufferedWriter bw =null;BufferedReader br =null;try { FileReader reader= new FileReader(sourceFile);FileWriter writer=new FileWriter(destFile);bw =new BufferedWriter(writer); br =new BufferedReader(reader); String line =null; while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); }}catch(IOException ex) {}finally { try { bw.close();} catch(IOException ex) {}try { br.close();} catch(IOException ex) {} }上述的代碼中有兩點需要注意:
當(dāng)按照行來讀取字符的時候 , 當(dāng)下一行沒有內(nèi)容 , 繼續(xù)讀取下一行的內(nèi)容 , 結(jié)果會返回 null , 可以此來判斷文件中是否還有字符 。當(dāng)讀取的文件行返回為null后 , 仍然會執(zhí)行一次循環(huán) , 此時調(diào)用newLine() 會在寫入的文件中多添加一個換行符 , 這個換行符無關(guān)緊要 , 可以不用考慮處理掉 。ObjectOutputStream & ObjectInputStream
在編寫程序的過程中 , 難免會遇到和外部程序進(jìn)行數(shù)據(jù)交流的需求 , 例如調(diào)用外部服務(wù) , 并傳輸一個對象給對方 , 此時需要把傳輸對象序列化為流才能和外部程序進(jìn)行交互 。又比如需要對一個對象進(jìn)行深拷貝 , 也可以將對象序列化為流之后再反序列化為一個新的對象 。Java提供了ObjectOutputStream 和 ObjectInputStream 來實現(xiàn)對對象的序列化和反序列化 。序列化后的流為字節(jié)流 , 為了清晰的看到序列化后的結(jié)果 , 以下將序列化后的流輸出到文件中然后在反序列化為一個對象 , 具體來看一看吧 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- java入門基礎(chǔ)知識 java算法題面試
- java解壓各種類型的文件 java解壓zip文件為空
- 講解java部署jar還是war優(yōu)劣 jar運行命令
- java程序員必備的基礎(chǔ)知識 java截取字符串后幾位
- 哪個培訓(xùn)班靠譜?想要培訓(xùn)Java的應(yīng)該如何選擇? 程序員編程培訓(xùn)
- 自學(xué)java堅持不下去了,要找Java培訓(xùn)機構(gòu)嗎 程序員編程培訓(xùn)
- 簡單好玩的編程代碼 javascriptvoid怎么解決
- 教你javascript實時獲取鼠標(biāo)位置 js獲取鼠標(biāo)點擊的位置
- 你做 Java 程序員真的是因為熱愛嗎? 程序員編程培訓(xùn)
- Java基本數(shù)據(jù)類型 java字符串拆分為數(shù)組
