同一FileStream写入数据后读取前是否需要调用Flush方法?
.NET 同 FileStream 写入后直接读取是否必须调用 Flush 方法
结论
默认配置下必须调用,只有在手动禁用了FileStream用户态缓冲区的特殊场景下可以省略。
原理说明
File.Create方法返回的默认FileStream实例自带用户态内存缓冲区,所有写入操作都会先落到这个缓冲区,不会立刻同步到文件系统。- 调用
CopyTo写入的内容在执行完后大概率还停留在用户态缓冲区,没有写入到底层文件中。如果此时直接调整流位置读取,读不到缓冲区里的未刷入数据,只会拿到不完整甚至为空的内容。 Flush方法的作用就是把用户态缓冲区里所有未写入的内容强制同步到底层文件系统,保证后续读取能拿到完整的写入内容。
特殊例外场景
只有满足以下任意条件时可以省略Flush调用:
- 创建FileStream时指定了
FileOptions.WriteThrough参数,该参数会禁用用户态缓冲区,所有写入操作直接同步到文件系统 - 写入后先关闭/释放流再重新打开读取:流Dispose时会自动执行Flush操作,但复用同一个流不关闭的场景不适用
示例代码说明
using Stream someOtherData = GetMeSomeData(); using FileStream fs = File.Create("Hello-world!"); someOtherData.CopyTo(fs); fs.Flush(); // 默认场景下必须调用,不可省略 fs.Position = 0; ReadDataInStream(fs); // 内部通过Stream.Read()读取流中数据
内容的提问来源于stack exchange,提问作者SpiritBob
相关产品推荐
相关产品推荐

