在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()
或者是否还有更多内容?
答案 0 :(得分:1)
这完全取决于使用的流。刷新流意味着在刷新期间将写入尚未写入的任何缓冲数据。因此,如果您使用的流不缓冲任何数据,您将看不到任何差异。如果你没有冲洗流,它会在你关闭它的那一刻被冲洗。
您提到的文档仅说明:
所有派生类都应覆盖Flush,以确保将所有缓冲的数据发送到流。
刷新流不会刷新其底层编码器,除非您明确调用Flush或Close。将AutoFlush设置为true意味着数据将从缓冲区刷新到流,但不会刷新编码器状态。这允许编码器保持其状态(部分字符),以便它可以正确编码下一个字符块。 此方案影响UTF8和UTF7,其中某些字符只能在编码器接收到相邻字符后进行编码。
答案 1 :(得分:0)
使用BinaryWriter调用Flush()只是刷新基础流(BaseStream)。
通常在关闭基础流时会自动完成此操作,因此在大多数情况下,您无需显式调用它,并且如果您正在使用BinaryWriter编写多个记录,并且基础流是FileStream,那么它将非常更高效,不必每次都调用它。
在将多条记录写入不同位置时,也不需要在调用Seek之前调用Flush(对于BinaryWriter)。
对于其他确实缓冲数据的流编写类,情况可能有所不同。