您是否必须刷新BinaryWriter数据

时间:2018-01-01 17:00:05

标签: c# binarywriter

在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提到你应该使用flush你的二进制编写器。

但是我注意到,一旦调用了br.Write,数据就会被发送,我认为不需要调用br.Flush?

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

2 个答案:

答案 0 :(得分:1)

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

您提到的文档仅说明:

  

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

     

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

答案 1 :(得分:0)

使用BinaryWriter调用Flush()只是刷新基础流(BaseStream)。

通常在关闭基础流时会自动完成此操作,因此在大多数情况下,您无需显式调用它,并且如果您正在使用BinaryWriter编写多个记录,并且基础流是FileStream,那么它将非常更高效,不必每次都调用它。

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

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