2010-03-10 658 views
42

StreamWriter.Flush()StreamWriter.Close()之間的區別是什麼?StreamWriter.Flush()和StreamWriter.Close()有什麼區別?

當我的數據沒有正確寫入文件時,我在代碼的末尾添加了Flush()Close()。但是,我意識到,添加或者Flush()Close()都允許數據被正確寫入。

當我閱讀MSDN文檔時,我無法準確理解每種方法的作用;我只知道爲確保數據的正確寫入而需要一個或另一個。任何進一步的解釋將不勝感激。


哪裏s是要寫入的字符串,這裏是我的代碼是什麼樣子目前:

 StreamWriter sw = File.CreateText("TextOutput.txt"); 
     sw.Write(s); 
     sw.Flush(); 
     sw.Close(); 

基於從答案的反饋,我已經在using重寫我的代碼塊,它實現了IDisposable,並且會在處理對象時自動處理將文件寫入文件:

 using (StreamWriter sw = File.CreateText("TextOutput.txt")) 
     { 
      sw.Write(s); 
     } 

回答

85

StreamWriter.Flush()可以在任何時候需要清除緩衝區時調用,並且流將保持打開狀態。

StreamWriter.Close()用於關閉流,此時緩衝區也被刷新。

但是你不應該真的需要調用其中之一。任何時候我在代碼中看到一個.Close()我都會將其視爲代碼異味,因爲它通常意味着意外的異常可能會導致資源處於打開狀態。你應該做的,是在使用塊創建StreamWriter變量,像這樣:

using (var writer = new StreamWriter("somefilepath.txt")) 
{ 
    // write a bunch of stuff here 
} // the streamwriter WILL be closed and flushed here, even if an exception is thrown. 
+12

這是因爲Stream.Dispose調用Close() – munissor 2010-03-10 15:18:47

+0

是清楚的,在'using'(或'try' /'catch')塊中封裝'StreamWriter'對象會強制關閉對象? – 2010-03-10 15:20:12

+4

@Ben - 將它封裝在try/catch中將不會強制它關閉。將'.Close()'調用封裝在'finally'塊或'using'塊中,並且使用塊更加方便。 – 2010-03-10 15:22:20

0

從MSDN:

同花順:清除當前作家的所有緩衝區並使所有緩衝的數據是寫入底層的流。

關閉:關閉當前StreamWriter對象和基礎流。

11

StreamWriter.Flush()將刷新流中的任何內容到文件中。這可以在使用流的過程中完成,你可以繼續寫。

StreamWriter.Close()關閉寫入流。這包括最後一次沖洗溪流。

儘管如此,還是有更好的辦法。由於StreamWriter實現了IDisposable,因此可以將StreamWriter封裝在using塊中。

using(StreamWriter sw = new StreamWriter(stream)) 
{ 
    // Work with things here 
} 

using塊後,Dispose將被稱爲...這將刷新並關閉流爲您服務。

1

沖洗強制將緩衝區寫入磁盤。關閉 - 關閉流,並執行內部刷新操作

+1

對於文件流,關閉並刷新寫入操作系統的寫入延遲磁盤緩存,但不通過磁盤。你必須使用FileStream的Flush(true)。它是在.NET 4.0中添加的,但已被破解。錯誤鏈接表示固定,但沒有說明它修復了哪個版本:http://connect.microsoft.com/VisualStudio/feedback/details/634385/filestream-flush-flushtodisk-true-call-does-not-flush -the-buffers-to-disk#詳細信息 – jimvfr 2013-02-13 22:45:19

4

我有一個情況,我正在寫一個很長的字符串到一個帶有基礎MemoryStream的StreamWriter。在作者和流被處置之前,MemoryStream正在被別的東西消耗掉。

using (var memoryStream = new MemoryStream()) 
using (var streamWriter = new StreamWriter(memoryStream , Encoding.UTF8)) 
{ 
    streamWriter.Write(someRealyLongStringValue); 
    DoSomethingWithTheStream(memoryStream); 
} 

確實很長的字符串字符串的末尾被截斷。這是通過在使用流之前調用flush來解決的。或者我可以將AutoFlush設置爲true。

+0

謝謝,我自己剛剛遇到了這個問題。 – Coxy 2015-11-17 01:20:39