我需要类似于 JavaRandomAccessFile(path, "rws")
方法的行为,即将数据写入文件后立即将其刷新到磁盘。
我倾向于将BinaryWriter
其用于我的目的,但它没有办法指定冲洗行为。
有什么建议么?
我需要类似于 JavaRandomAccessFile(path, "rws")
方法的行为,即将数据写入文件后立即将其刷新到磁盘。
我倾向于将BinaryWriter
其用于我的目的,但它没有办法指定冲洗行为。
有什么建议么?
BinaryWriter
不是sealed
,所有的Write
方法都是virtual
。您可以覆盖它们并添加对 的调用Flush
,例如:
public override void Write(byte value)
{
base.Write(value);
Flush(); // which is just: this.OutStream.Flush();
}
然而!在大多数情况下,这对性能非常不利。我不推荐它。
如果您使用的是 aStreamWriter
或类似的,则只需设置AutoFlush
为true
; 任务完成; 但同样——这真的会损害性能。
我建议编写一个扩展方法作为包装器:
public static class MyBinaryWriterExtensions {
public static void WriteAndFlush(this BinaryWriter writer, byte[] data) {
writer.Write(data);
// Slow! Disk access is at least 10 ms! (for a fast disk)
writer.Flush();
}
}
这将被称为:
BinaryWriter bw = ... // Getting your writer somehow
byte[] data = ... // your data
bw.WriteAndFlush(data); // Will write and flush!
还是您需要某种原子性?
您可以将每个作家都放入“使用”中,最后将 Dispose() 它
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
对于文本,您可以使用File.WriteAllText
根本不需要刷新的功能
另请参阅 WriteThrough 选项,您可以在创建文件流时提供该选项。它会导致您的流跳过所有操作系统级别的缓冲。然而,我认为,在流的构造函数中指定的大小(如果未指定,则为 4k)在流中仍然存在缓冲。所以我认为使用 WriteThrough 流对象本身会缓冲,直到指定的缓冲区大小已满,然后立即写入底层存储。
Ayende 在这里有一篇文章:https ://ayende.com/blog/163073/file-io-flush-or-writethrough