1

我需要类似于 JavaRandomAccessFile(path, "rws")方法的行为,即将数据写入文件后立即将其刷新到磁盘。

我倾向于将BinaryWriter其用于我的目的,但它没有办法指定冲洗行为。

有什么建议么?

4

4 回答 4

1

BinaryWriter不是sealed,所有的Write方法都是virtual。您可以覆盖它们并添加对 的调用Flush,例如:

public override void Write(byte value)
{
    base.Write(value);
    Flush(); // which is just: this.OutStream.Flush();
}

然而!在大多数情况下,这对性能非常不利。我不推荐它。

如果您使用的是 aStreamWriter或类似的,则只需设置AutoFlushtrue; 任务完成; 但同样——这真的会损害性能。

于 2013-01-09T10:40:36.420 回答
0

我建议编写一个扩展方法作为包装器:

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!

还是您需要某种原子性?

于 2013-01-09T10:39:58.833 回答
0

您可以将每个作家都放入“使用”中,最后将 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根本不需要刷新的功能

于 2013-01-09T10:40:06.420 回答
0

另请参阅 WriteThrough 选项,您可以在创建文件流时提供该选项。它会导致您的流跳过所有操作系统级别的缓冲。然而,我认为,在流的构造函数中指定的大小(如果未指定,则为 4k)在流中仍然存在缓冲。所以我认为使用 WriteThrough 流对象本身会缓冲,直到指定的缓冲区大小已满,然后立即写入底层存储。

Ayende 在这里有一篇文章:https ://ayende.com/blog/163073/file-io-flush-or-writethrough

于 2017-04-09T23:02:31.403 回答