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

Ben*_*ack 54 .net c# file-io

StreamWriter.Flush()和之间的功能有什么区别StreamWriter.Close()

当我的数据不能被正确地写入一个文件,我既增加Flush()Close()对我的代码的结束.然而,我意识到,添加任一 Flush()Close()所允许的数据被正确写入.

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


s要写入的字符串在哪里,这是我的代码当前的样子:

StreamWriter sw = File.CreateText("TextOutput.txt");
sw.Write(s);
sw.Flush();
sw.Close();
Run Code Online (Sandbox Code Playgroud)

根据答案的反馈,我在一个using块中重写了我的代码,该块实现IDisposable并将自动处理在处理对象时将流写入文件:

using (StreamWriter sw = File.CreateText("TextOutput.txt"))
{
    sw.Write(s);
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 112

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

StreamWriter.Close() 用于关闭流,此时缓冲区也被刷新.

但你真的不需要打电话给其中任何一个.每当我.Close()在代码中看到代码时,我都会将其视为代码气味,因为它通常意味着意外异常可能导致资源保持打开状态.你应该做的是StreamWriter在using块中创建你的变量,如下所示:

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.
Run Code Online (Sandbox Code Playgroud)

  • 当您使用流编写器对象在代码中的不同位置写入时,不能使用"using".在这种情况下,您必须手动关闭流. (21认同)
  • 这是因为Stream.Dispose调用Close() (16认同)
  • "但是你不应该真的需要调用其中任何一个"......不适用于flush().你可能需要调用flush(),这样你就不会耗尽内存. (6认同)
  • @Ben - 将它封装在try/catch中将_not_强制关闭它.将`.Close()`调用封装在`finally`块或`using`块中,并且使用块更方便. (4认同)
  • @RayLoveless我用StreamWriter写了100多GB的文件,从来没有看到它使用太多的内存.它的内部缓冲区应该非常小,并且不应该对内存产生任何明显的影响.一旦缓冲区填满,它就会自动刷新. (3认同)
  • @Alsty Streams 在较长时间内保持开放和活跃,其中有单独的读者和作者。在这些情况下,您会在完成批处理写入后进行刷新,以确保读者可以使用它。 (2认同)

Jus*_*ner 15

StreamWriter.Flush()将Stream中的任何内容刷新到文件中.这可以在使用Stream的过程中完成,您可以继续编写.

StreamWriter.Close()关闭Stream进行写作.这包括最后一次刷新流.

尽管如此,还是有更好的方法.自StreamWriter实现以来IDisposable,您可以将StreamWriter包装在一个using块中.

using(StreamWriter sw = new StreamWriter(stream))
{
     // Work with things here
}
Run Code Online (Sandbox Code Playgroud)

using阻止之后,Dispose将被调用...将为您冲洗和关闭流.


Bro*_*ski 5

我有一个案例,我在一个带有底层MemoryStream的StreamWriter上写了一个非常长的字符串.在编写器和流处理之前,MemoryStream被其他东西占用.

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

对于非常长的字符串,字符串的末尾被截断.这是通过在使用流之前调用flush来解决的.或者,我可以将AutoFlush设置为true.