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);
}
答案 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对象和基础流。