2011-05-24 36 views

回答

12

the FileWriter class overview第二句話說:

這個類的構造函數假設默認的字符編碼和默認字節緩衝區大小是可接受的。要自己指定這些值,請在FileOutputStream上構造一個OutputStreamWriter。

(我的重點)

所以很明顯它的緩衝(除非默認字節緩衝區大小是零,他們正在用自己的措辭非常奇怪)。

我懷疑它只是在FileOutputStream上使用OutputStreamWriter。查看OutputStreamWriter

每次調用write()方法都會導致編碼轉換器在給定字符上被調用。 生成的字節在寫入底層輸出流之前會在緩衝區中累積。

(我的重點)

如果你想確保各級各類緩衝被刷新,在某種程度上就可以了,看看使用的flush method

+0

感謝詳盡的答覆。 – Jeb 2011-05-24 09:32:10

+0

@user:不用擔心,希望有所幫助。 – 2011-05-24 09:35:40

+0

感謝您指出這一點。我也在文檔中錯過了它,當'tail'沒有顯示我的寫作時真的很困惑! – Hamy 2014-09-29 18:41:11

5

我懷疑這是一個實現細節,但我希望大多數實現使用緩衝區,是的。你當然不應該依賴它是不緩衝的。當你沖洗或關閉作家時,應該沒問題。

請注意,我個人不喜歡使用FileWriter,因爲它不允許您指定字符編碼 - 我通常將FileOutputStream換成OutputStreamWriter

0

看看類sun.nio.cs.StreamEncoder.CharsetSE.implWrite()。 它使用ByteBuffer

StreamEncoder.CharsetSE類在內部由OutputStreamWriter使用,它由FileWriter在內部使用。

0

似乎它使用緩衝區,但以某種其他方式(低級別,默認情況下緩衝區可能爲空)。需要由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>"