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

时间:2010-03-10 15:13:01

标签: c# .net 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();

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

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

5 个答案:

答案 0 :(得分:99)

只要您需要清除缓冲区,就可以调用

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.

答案 1 :(得分:11)

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

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

虽然有更好的办法。由于StreamWriter实现了IDisposable,因此您可以将StreamWriter包装在using块中。

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

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:1)

刷新强制将缓冲区写入磁盘。关闭 - 关闭流,并执行内部刷新操作

答案 4 :(得分:0)

来自MSDN:

Flush:清除当前writer的所有缓冲区,并将所有缓冲的数据写入底层流。

关闭:关闭当前的StreamWriter对象和基础流。

相关问题