對OutputStream類的flush()方法的誤解

最近使用java的FileOutputStream寫文件,調用到了flush()方法。
於是查看了FileInputStream類的源代碼,發現flush()其實是繼承於其父類OutputStream的。
而OutputStream類的flush()卻什麼也沒做,恍然大悟,真是“看源代碼者得真相啊”。
其實flush()是Flushable接口的方法,官方文檔的對該方法的註釋是“Flushes this output stream and forces any buffered output bytes to be written out.”。
OutputStream方法實現了Flushable接口,而又什麼也沒做,真是讓人一頭霧水,於是就出現了我的誤解。


那麼什麼時候flush()纔有效呢?
答案是:當OutputStream是BufferedOutputStream時。


當寫文件需要flush()的效果時,需要
FileOutputStream fos = new FileOutputStream("c:\a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
也就是說,需要將FileOutputStream作爲BufferedOutputStream構造函數的參數傳入,然後對BufferedOutputStream進行寫入操作,才能利用緩衝及flush()。

查看BufferedOutputStream的源代碼,發現所謂的buffer其實就是一個byte[]。
BufferedOutputStream的每一次write其實是將內容寫入byte[],當buffer容量到達上限時,會觸發真正的磁盤寫入。
而另一種觸發磁盤寫入的辦法就是調用flush()了。


原文鏈接:http://www.xuebuyuan.com/939145.html
發佈了30 篇原創文章 · 獲贊 31 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章