【问题标题】:Do you have to flush your BinaryWriter data您是否必须刷新 BinaryWriter 数据
【发布时间】:2018-06-11 14:29:54
【问题描述】:

在 C# 中,我像这样使用 BinaryWriter:

BinaryWriter br = new BinaryWriter(myPipe);
var bytes = new byte[5];
br.Write(bytes);
br.Flush();

https://msdn.microsoft.com/de-de/library/system.io.binarywriter.flush(v=vs.110).aspx 提到你应该使用刷新你的二进制写入器。

但是我注意到,只要调用 br.Write,数据就已经发送,我认为不需要调用 br.Flush?

我想知道是否可以删除那 1 行(不必要的)代码:br.Flush() 或者是否还有更多内容?

【问题讨论】:

  • 总是最好保留。有一个 windows 计时器用于将数据从流移动到输出文件。经常发生的情况是,当关闭流文件时,并非所有数据都从流传输到文件。

标签: c# binarywriter


【解决方案1】:

这完全取决于使用的流。刷新流意味着在刷新期间将写入任何尚未写入的缓冲数据。因此,如果您使用的流不缓冲任何数据,您将看不到任何差异。如果您不刷新流,它将在您关闭它的那一刻被刷新。

您提到的文档仅说明:

所有派生类都应覆盖 Flush 以确保将所有缓冲数据发送到流。

除非您明确调用 Flush 或 Close,否则刷新流不会刷新其底层编码器。将 AutoFlush 设置为 true 意味着数据将从缓冲区刷新到流中,但不会刷新编码器状态。这允许编码器保持其状态(部分字符),以便它可以正确编码下一个字符块。 这种情况会影响 UTF8 和 UTF7,其中某些字符只有在编码器接收到一个或多个相邻字符后才能被编码

【讨论】:

    【解决方案2】:

    使用 BinaryWriter 调用 Flush() 只会刷新底层流 (BaseStream)。

    这通常是在底层流关闭时自动完成的,所以在大多数情况下你不需要显式调用它,如果你正在使用 BinaryWriter 写入多条记录,而底层流是一个 FileStream,它会很多不要每次都调用它更有效。

    在将多条记录写入不同位置时,您也不需要在调用 Seek 之前调用 Flush(用于 BinaryWriter)。

    对于其他缓冲数据的流写入类,情况可能有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多