2009-11-16 67 views
26

我有一個問題,在寫入文件時,在關閉完成之前,我們是否應該包含flush()??。如果是這樣,它會做什麼?不要流自動刷新?? 編輯:flush in java.io.FileWriter

因此沖洗它實際上做什麼?

回答

18

寫入程序和數據流通常會將一些輸出數據緩存到內存中,並嘗試一次寫入更大的塊,刷新會導致立即從緩衝區寫入磁盤,因此如果程序崩潰數據不會丟失,當然也不能保證,因爲磁盤可能不會立即物理寫入數據,所以它可能仍然會丟失,但這不會是Java程序的錯誤:)

PrintWriters一個uto-flush(默認情況下)當你寫一個行尾時,當你關閉它們時,流和緩衝區會被刷新。除此之外,只有當緩衝區滿時纔會沖洗。

+0

緩衝區大小是動態還是靜態? – i2ijeya 2009-11-16 14:38:04

+0

這很重要嗎?這是Java的緩衝區,不是你的。我看了但沒有找到設置或改變它的方法。我認爲你必須接受給定的流的緩衝行爲。 – 2009-11-16 17:58:54

+14

PrintWriters默認不會自動刷新。要得到一個自動刷新,你必須使用PrintWriter(OutputStream,boolean)構造函數明確要求它。 – Aaron 2011-02-04 13:02:52

2

自動關閉沖洗。你不需要調用它。

11

您不需要執行刷新操作,因爲close()會爲您執行刷新操作。

根據JavaDoc:

「關閉該流,沖洗它首先一旦流已關閉,還寫()或沖洗()調用將導致拋出IOException關閉以前封閉。但是,流不起作用。「

+2

我唯一使用flush的方式是我在某種進程間通信中使用流。例如,也許一個進程正在寫入一個命名管道,另一個正在讀取它,我不想關閉管道的文件句柄,因爲我稍後會寫更多,但我想確保所有數據都已刷新到命名管道以便其他進程有它 – Benj 2009-11-16 19:20:32

1

正如其他人所說,在關閉()之前調用flush()沒有意義。使用flush()的時間是,如果您要保持文件打開,但要確保先前的寫入已完全完成。

+0

它將如何確保文件寫入已完成? – i2ijeya 2009-11-16 14:21:01

4

要回答你關於什麼flush實際上做了什麼的問題,它確保你寫入流的任何東西 - 你的案例中的一個文件 - 實際上在那裏寫入文件。

Java可以執行緩衝,這意味着它將保持寫入內存的數據直到它有一定的數量,然後將它全部寫入文件中,這樣更有效。這樣做的缺點是文件在任何時候都不一定是最新的。 Flush是一種說法:「使文件保持最新狀態

關閉調用首先進行刷新以確保在關閉文件之後有您期望看到的文件,因此正如其他人指出的那樣,不需要在關閉之前清空

1

如上所述,你通常不需要刷新。

只有在出於某種原因需要另一個進程查看正在處理的文件的完整內容而不關閉它時纔有意義。例如,它可以用於多個進程同時修改的文件,雖然有很多照顧:-)

20

我強烈建議在關閉前調用flush。基本上它將剩餘的緩衝數據寫入文件。

如果您明確地致電flush,您可能確定close出來的任何IOException真的是災難性的並且與釋放系統資源有關。

當您自己flush時,您可以像處理數據寫入異常一樣處理其IOException

1

FileWriter是一個邪惡的類,因爲它可以捕獲任何恰好存在的字符集,而不會採用明確的字符集。即使你確實想要默認值,也要明確它的意思。

通常的解決方案是OutputStreamWriterFileOutputStream。裝飾器有可能拋出異常。因此,即使作者從未構建過,您也需要關閉流。如果你打算這樣做,你只需要刷新作者(在快樂的情況下),並且總是關閉流。 (只是容易混淆,一些修飾器,比如處理zip文件,有資源需要關閉。)

1

另一個用於在程序中刷新的用例是將長時間運行的作業的進度寫入文件(因此可以稍後停止並重新啓動。你想確保數據在驅動器上是安全的。

while (true) { 
    computeStuff(); 
    progresss += 1; 
    out.write(String.format("%d", progress)); 
    out.flush(); 
} 
out.close();