我正在使用FileWriter,我注意到奇怪的行爲。 我緩存我的收藏我和每x行我用java - FileWriter使用緩衝區嗎? (它的行爲就像我的例子)
IOUtils.writelines(myList,"\n", writer);
它不寫入文件。我繼續用更多的行來調用它,並且只有在它寫滿文件後纔會調用它。
它使用緩衝區嗎?我無法在它的文檔中找到它。
我正在使用FileWriter,我注意到奇怪的行爲。 我緩存我的收藏我和每x行我用java - FileWriter使用緩衝區嗎? (它的行爲就像我的例子)
IOUtils.writelines(myList,"\n", writer);
它不寫入文件。我繼續用更多的行來調用它,並且只有在它寫滿文件後纔會調用它。
它使用緩衝區嗎?我無法在它的文檔中找到它。
的the FileWriter
class overview第二句話說:
這個類的構造函數假設默認的字符編碼和默認字節緩衝區大小是可接受的。要自己指定這些值,請在FileOutputStream上構造一個OutputStreamWriter。
(我的重點)
所以很明顯它的緩衝(除非默認字節緩衝區大小是零,他們正在用自己的措辭非常奇怪)。
我懷疑它只是在FileOutputStream
上使用OutputStreamWriter
。查看OutputStreamWriter
:
每次調用write()方法都會導致編碼轉換器在給定字符上被調用。 生成的字節在寫入底層輸出流之前會在緩衝區中累積。
(我的重點)
如果你想確保各級各類緩衝被刷新,在某種程度上就可以了,看看使用的flush
method。
我懷疑這是一個實現細節,但我希望大多數實現使用緩衝區,是的。你當然不應該依賴它是不緩衝的。當你沖洗或關閉作家時,應該沒問題。
請注意,我個人不喜歡使用FileWriter
,因爲它不允許您指定字符編碼 - 我通常將FileOutputStream
換成OutputStreamWriter
。
看看類sun.nio.cs.StreamEncoder.CharsetSE.implWrite()
。 它使用ByteBuffer。
StreamEncoder.CharsetSE類在內部由OutputStreamWriter使用,它由FileWriter在內部使用。
似乎它使用緩衝區,但以某種其他方式(低級別,默認情況下緩衝區可能爲空)。需要由BufferedWriter包裝它。從的BufferedWriter的javadoc:
"In general, a Writer sends its output immediately to the underlying
character or byte stream. Unless prompt output is required, it is advisable
to wrap a BufferedWriter around any Writer whose write() operations may be
costly, such as FileWriters and OutputStreamWriters. For example,
<pre>
PrintWriter out
= new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
</pre>"
感謝詳盡的答覆。 – Jeb 2011-05-24 09:32:10
@user:不用擔心,希望有所幫助。 – 2011-05-24 09:35:40
感謝您指出這一點。我也在文檔中錯過了它,當'tail'沒有顯示我的寫作時真的很困惑! – Hamy 2014-09-29 18:41:11