Java のRandomAccessFile(path, "rws")
方法と同様の動作、つまり、データがファイルに書き込まれるとすぐにディスクにフラッシュする必要があります。
私は自分の目的のために使用することに傾いてBinaryWriter
いますが、フラッシュ動作を指定する方法がありません。
助言がありますか?
Java のRandomAccessFile(path, "rws")
方法と同様の動作、つまり、データがファイルに書き込まれるとすぐにディスクにフラッシュする必要があります。
私は自分の目的のために使用することに傾いてBinaryWriter
いますが、フラッシュ動作を指定する方法がありません。
助言がありますか?
BinaryWriter
ではなくsealed
、すべてのWrite
メソッドはvirtual
です。それらをオーバーライドして、への呼び出しを追加できますFlush
。たとえば、次のようになります。
public override void Write(byte value)
{
base.Write(value);
Flush(); // which is just: this.OutStream.Flush();
}
でも!ほとんどの場合、これはパフォーマンスにとって非常に悪いものです。お勧めしません。
StreamWriter
または類似のものを使用している場合は、単に;に設定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' に入れることができます
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
フラッシュをまったく必要としない関数を使用できます