首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StreamWriter.Flush()也会调用FileStream.Flush()吗?

StreamWriter.Flush()也会调用FileStream.Flush()吗?
EN

Stack Overflow用户
提问于 2012-10-24 05:56:47
回答 2查看 4.6K关注 0票数 9

我有一个StreamWriter,它的底层流是FileStream。下面的代码将保证FileStream也将其缓冲区刷新到文件系统上的实际文件中,还是需要显式地调用FileStream上的Flush()

代码语言:javascript
复制
using (var fs = new FileStream("blabla", FileMode.Append)) {
    using (var sw = new StreamWriter(fs)) {
        sw.WriteLine("Hello, I want to be flushed.");
        sw.Flush(); //I need this to also flush onto the file, not just to the FileStream
    }
}

根据MSDN,“刷新流不会刷新它的底层编码器,除非您显式地调用刷新或关闭”,但是我不知道FileStream是否可以被认为是“底层编码器”。

另外,如果我不指定FileOptions.WriteThrough,是否可以保证操作系统最终会将刷新行写入磁盘,即使程序在两个流关闭之前崩溃(例如,假设没有using {}块,只调用Flush())?

在我的场景中,我需要保持流是打开的(用于日志记录),因此我不能使用using {}块,但是我希望确保即使程序崩溃,数据也总是被写入磁盘。如果电源关机,并且操作系统没有刷新到磁盘上,我可以承受丢失数据的代价,但否则,我需要操作系统最终刷新,即使我从未在流上正确调用Close()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-24 06:15:14

是的,在Flush上调用StreamWriter将导致底层流被Flush编辑。4.5版本调用一个私有Flush(bool,bool)函数,其结尾为:

代码语言:javascript
复制
if (flushStream)
{
    this.stream.Flush();
}

其中flushStream是第一个参数,this.stream是构建StreamWriter的流,Flush()中的调用是Flush(true,true)

(回答的较老部分-我回答得很迂回。)将答案中最相关的部分移至顶部)

在我能找到的任何文档中都没有明确说明它,但是通过传递另一个流来构造的任何流类都应该被假定为“获得该流的所有权”(除非另有特别的调用)。

也就是说,一旦使用StreamWriter构建了fs,就不应该自己对fs执行任何直接操作。

您从MSDN引用的部分与后面的句子有关:

这允许编码器保持其状态(部分字符),以便能够正确地编码下一个字符块。此方案影响UTF8和UTF7,其中某些字符只能在编码器接收到相邻字符后才能编码。

也就是说,您可能已经将数据传递给Write,以便为它提供一些Unicode代理,但不是一个完整的字符。Flush不会将这些代理写到流中。只要您总是将格式良好(完整)的字符串传递给Write,您就不必担心这一点。

票数 9
EN

Stack Overflow用户

发布于 2012-10-24 06:04:27

如果与一起使用块,则保证流处理!

使用一个流链,关闭最外层的流(在链的顶端) i.e StreamWriter in your case关闭整批i.e FileStream

当流为immediately.Flush时,刷新方法强制写入内部缓冲区,因此无需执行以下操作

s.Flush();s.Close();

因此,当最顶层的流关闭时,它会刷新,然后关闭底层流,后者也会刷新那里的内容。

例如,考虑这条链

代码语言:javascript
复制
FileStream->GZipStream->StreamWriter

所以,当你关闭StreamWriter的时候

StreamWriter flushes和closes.It也关闭了undelying GZipStream

GzipStream刷新和closes.It也关闭底层FileStream

FileStream flushescloses

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13043706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档