flush()方法介紹
查閱文檔可以發現,IO流中每一個類都實現了Closeable接口,它們進行資源操作之后都需要執行close()方法將流關閉 。但字節流與字符流的不同之處在於:字節流是直接與數據產生交互,而字符流在與數據交互之前要經過一個緩沖區 。
草圖:
使用字符流對資源進行操作的時候,如果不使用close()方法,則讀取的數據將保存在緩沖區中,要清空緩沖區中的數據有兩種辦法:
public abstract void close() throws IOException
關閉流的同時將清空緩沖區中的數據,該抽象方法由具體的子類實現public abstract void flush() throws IOException
不關閉流的話,使用此方法可以清空緩沖區中的數據,但要注意的是,此方法只有Writer類或其子類擁有,而在Reader類中並沒有提供。此方法同樣是在具體的子類中進行實現 。
public class Writer_Flush_Test { public static void main(String[] args) throws IOException { File file = new File("D:" + File.separator + "IOTest" + File.separator + "newFile.txt"); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } Writer w = new FileWriter(file, true); w.flush(); w.write("@@@這是測試flush方法的字符串***\n"); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
結果可以發現,清空了緩沖區中的數據再向文件中寫入時,數據寫不進去 。
flush()使用注意事項
修改以上代碼,當清空緩沖區,再寫入之后,如果再執行close()關閉流的方法,數據將正常寫入 。
public class Writer_Flush_Test { public static void main(String[] args) throws IOException { File file = new File("D:" + File.separator + "IOTest" + File.separator + "newFile.txt"); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } Writer w = new FileWriter(file, true); w.flush(); w.write("@@@這是測試flush方法的字符串***\n"); // 執行之前操作之后使用close()關閉流 w.close(); }
微信公眾號【黃小斜】大廠程序員,互聯網行業新知,終身學習踐行者。關注后回復「Java」、「Python」、「C++」、「大數據」、「機器學習」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「筆試」、「面試」、「面經」、「計算機基礎」、「LeetCode」 等關鍵字可以獲取對應的免費學習資料。
可以發現此時正常寫入文件中 。具體原因未知,希望明白的朋友告知,但就目前來看,要做的是一定要避免這樣的錯誤 。