我可以创建一个新的 BinaryWriter 并在 Stream 上写入,而该流已经被另一个 BinaryWriter 使用了吗?
我需要递归地写入一些数据,但我想避免将 BinaryWriter 作为参数传递给方法,因为我需要传递一个 Stream。因此,将在流上写入数据的每个方法可能需要创建自己的 BinaryWriter 实例。但我不知道这是否正确。目前,它在 FileStream 上运行良好,但我不知道它是否会导致用户计算机出现意外结果。
我写了一个简单的例子来说明我想要实现的目标。 BinaryWriter 的这种用法是错误的吗?
例子:
public Main()
{
using (var ms = new MemoryStream())
{
// Write data on the stream.
WriteData(ms);
}
}
private void WriteData(Stream output)
{
// Create and use a BinaryWriter to use only on this method.
using (var bWriter = new BinaryWriter(output, Encoding.UTF8, true))
{
// Write some data using this BinaryWriter.
bWriter.Write("example data string");
// Send the stream to other method and write some more data there.
WriteMoreData(output);
// Write some more data using this BinaryWriter.
bWriter.Write("another example data string");
}
}
private void WriteMoreData(Stream output)
{
// Create and use a BinaryWriter to use only on this method.
using (var bWriter = new BinaryWriter(output, Encoding.Unicode, true))
{
// Write some data on this BinaryWriter.
bWriter.Write("write even more example data here");
}
}
最佳答案
它应该可以正常工作。 BinaryWriter
本身不缓冲,因此每个实例不会干扰其他实例写入的数据。您正在为 true
参数传递 leaveOpen
,因此在处理每个实例时,它不会关闭底层流。
但在旁观者的眼中,“错误”在某种程度上是存在的。我会说最好通过 BinaryWriter
。MemoryStream
没有缓冲,但其他类型有缓冲。 BinaryWriter
的每个实例在处理时都会刷新流。有些人可能认为这效率低下,因为它至少部分地否定了缓冲的好处。在这里不是问题,但可能不是最好的习惯。
此外,BinaryWriter
的每个实例都将为垃圾收集器创建额外的工作。如果真的只有几个,那可能不是问题。但是,如果实际示例涉及更多调用,则可能会开始引起注意,尤其是当底层流是 MemoryStream
时(即您没有处理一些慢速设备 I/O)。
更重要的是,我没有看到在同一流上使用多个 BinaryWriter
实例的任何明显优势。看起来自然的、可读的、易于维护的事情是创建一个 BinaryWriter
并重用它,直到你完成编写。
为什么要避免将其作为参数传递?您已经通过了 Stream
。只需传递 BinaryWriter
即可。如果您确实需要直接访问底层流,它始终可以通过 BinaryWriter.BaseStream
获得。
底线:我不能说你的提议本身有任何明显的错误。但它与正常惯例的偏差(对我来说,无论如何)没有明显的好处。如果你有一个很好的理由来这样做,它应该有效。但我建议反对它。
关于c# - 我可以在同一个流上使用多个 BinaryWriters 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39156993/