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你的StreamWriter
variables,如下所示:
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。