.NET IO:我可以强制二进制编写器(或文件流)始终刷新到磁盘吗?
我需要类似于Java方法的行为,即在数据写入文件后立即将其刷新到磁盘 我倾向于使用我的目的,但它没有一种方法来指定冲洗行为.NET IO:我可以强制二进制编写器(或文件流)始终刷新到磁盘吗?,.net,io,.net,Io,我需要类似于Java方法的行为,即在数据写入文件后立即将其刷新到磁盘 我倾向于使用我的目的,但它没有一种方法来指定冲洗行为 有什么建议吗?我建议编写一个扩展方法作为包装: public static class MyBinaryWriterExtensions { public static void WriteAndFlush(this BinaryWriter writer, byte[] data) { writer.Write(data); // Slow! Di
有什么建议吗?我建议编写一个扩展方法作为包装:
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!
或者您需要某种原子性吗?我建议编写一个作为包装器的扩展方法:
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!
或者你需要某种原子性吗?你可以让每一个编写器都进入“使用”状态,并在最后处理它()
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
函数您可以让每个写入程序都进入“使用”状态,并在最后对其进行处理()
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
对于文本,您可以使用根本不需要刷新的
文件.writealText
函数BinaryWriter
不是密封的
,所有写入
方法都是虚拟的
。您可以覆盖它们并添加对Flush
的调用,例如:
public override void Write(byte value)
{
base.Write(value);
Flush(); // which is just: this.OutStream.Flush();
}
然而!在大多数情况下,这对性能非常不利。我不推荐
如果您使用的是
StreamWriter
或类似工具,则只需将AutoFlush
设置为true
;完成的工作;但是再一次-这确实会影响性能。BinaryWriter
不是密封的
,所有写入
方法都是虚拟的
。您可以覆盖它们并添加对Flush
的调用,例如:
public override void Write(byte value)
{
base.Write(value);
Flush(); // which is just: this.OutStream.Flush();
}
然而!在大多数情况下,这对性能非常不利。我不推荐
如果您使用的是
StreamWriter
或类似工具,则只需将AutoFlush
设置为true
;完成的工作;但同样-这可能会影响性能。另请参阅WriteThrough选项,您可以在创建文件流时提供该选项。它会导致流跳过所有操作系统级缓冲。但是,我认为流中仍然存在缓冲,缓冲大小在流的构造函数中指定(如果未指定,则为4k)。因此,我认为通过WriteThrough,流对象本身会缓冲到指定的缓冲区大小已满,然后立即写入底层存储
Ayende在这里有一个write-up:另请参见WriteThrough选项,您可以在创建文件流时提供该选项。它会导致流跳过所有操作系统级缓冲。但是,我认为流中仍然存在缓冲,缓冲大小在流的构造函数中指定(如果未指定,则为4k)。因此,我认为通过WriteThrough,流对象本身会缓冲到指定的缓冲区大小已满,然后立即写入底层存储
Ayende在这里写了一篇文章:“它将标记为垃圾收集器”-
使用
与垃圾收集器完全无关使用
只意味着如果变量非空,它将在块的末尾调用IDisposable.Dispose()
。@marcGravel,…,这将标记它为准备好进行垃圾回收或实际上不准备进行垃圾回收。它没有显式地将其标记为垃圾收集器就绪。如果保留对writer
的引用,则仍然不会收集该引用。无论您是否使用using
,垃圾收集的行为都将100%相同。这两件事在技术层面上是完全不相关的(虽然在人类层面上,它们似乎做了相似的事情,但一件是确定性的,另一件是非确定性的)。不存在将对象标记为“准备收集”这样的事情。这个概念不存在。@MarcGravel,因为您在退出此使用(在我的示例中)writer后无法保留对writer的引用,因此writer将被标记为准备收集。如果您说无法将其标记为收藏或暂时阻止其收藏,您可以阅读本文。我简化了我对Java的回答,他可能不知道如何使用,但也许你是对的,我简化得太多了。垃圾收集器本身会标记对象,这样它就不会收集它们。正如马克所说。。完全无关。“它将标记为垃圾收集器”-使用
与垃圾收集器完全无关使用
只意味着如果变量非空,它将在块的末尾调用IDisposable.Dispose()
。@marcGravel,…,这将标记它为准备好进行垃圾回收或实际上不准备进行垃圾回收。它没有显式地将其标记为垃圾收集器就绪。如果保留对writer
的引用,则仍然不会收集该引用。无论您是否使用using
,垃圾收集的行为都将100%相同。这两件事在技术层面上是完全不相关的(虽然在人类层面上,它们似乎做了相似的事情,但一件是确定性的,另一件是非确定性的)。不存在将对象标记为“准备收集”这样的事情。这个概念不存在。@MarcGravel,因为您在退出此使用(在我的示例中)writer后无法保留对writer的引用,因此writer将被标记为准备收集。如果您说无法将其标记为收藏或暂时阻止其收藏,您可以阅读本文。我简化了我对Java的回答,他可能不知道如何使用,但也许你是对的,我简化得太多了。垃圾收集器本身会标记对象,这样它就不会收集它们。正如马克所说。。完全不相关。如果您使用的是StreamWriter
,一种更简单的方法是将AutoFlush
设置为true
@marcGravel。这完全正确,我计划编写BinaryWriter,不过:)编辑..如果您使用的是StreamWriter
,eas