StreamWriter.Flush()和StreamWriter.Close()有什么区别?

StreamWriter.Flush()StreamWriter.Close()之间的function有什么区别?

当我的数据没有正确写入文件时,我在代码的末尾添加了Flush()Close() 。 但是,我意识到添加Flush()Close()允许数据写入正确。

当我阅读MSDN文档时,我无法准确了解每种方法的作用; 我只知道为了确保数据的正确写入,需要一个或另一个。 任何进一步的解释将不胜感激。


其中s是要写入的string,下面是我的代码当前的样子:

  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); } 

StreamWriter.Flush()可以在您需要清除缓冲区时调用,并且stream将保持打开状态。

StreamWriter.Close()用于closuresstream,此时缓冲区也被刷新。

但是你不应该真的需要调用其中的任何一个。 任何时候我在代码中看到一个.Close() ,我会把它看作是一种代码异味,因为它通常意味着意外的exception可能导致资源被打开。 你应该做的是在一个使用块中创build你的StreamWritervariables,如下所示:

 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. 

StreamWriter.Flush()将刷新stream中的任何内容到文件中。 这可以在使用stream的中间完成,你可以继续写。

StreamWriter.Close()closuresstream写入。 这包括最后一次刷新stream。

尽pipe如此,还是有更好的办法。 由于StreamWriter实现了IDisposable ,所以可以将StreamWriter封装在一个using块中。

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

using块之后, Dispose将被调用…将为您刷新并closuresstream。

我有一个情况,我正在写一个很长的string到一个底层MemoryStream StreamWriter。 在作者和stream被处置之前,MemoryStream正在被别的东西消耗掉。

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

对于真正长的string,string的末尾被截断。 这是通过在使用stream之前调用flush来解决的。 或者我可以将AutoFlush设置为true。

冲洗强制将缓冲区写入磁盘。 closures – closuresstream,并执行内部刷新操作

来自MSDN:

刷新(Flush):清除当前写入器的所有缓冲区,并使任何缓冲的数据写入基础stream。

closures:closures当前StreamWriter对象和基础stream。