我可以创建一个新的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");
}
}
答案 0 :(得分:2)
这对BinaryWriter的使用是错误的吗?
应该可以正常工作。 BinaryWriter
本身不进行缓冲,因此每个实例都不会干扰其他实例写入的数据。您正在为true
参数传递leaveOpen
,因此当处置每个实例时,它都不会关闭基础流。
但是"错误"在某种程度上是旁观者的眼睛。我会说最好通过BinaryWriter
。
MemoryStream
没有被缓冲,但其他类型是。 BinaryWriter
的每个实例,当它被处置时,将刷新流。有些人认为这可能效率低下,因为它至少部分地否定了缓冲的好处。这里不是问题,但可能不是最好的习惯。
此外,BinaryWriter
的每个实例都将为垃圾收集器创建额外的工作。如果真的只有少数几个,那可能不是问题。但是,如果真实世界的示例涉及更多的调用,那么这可能会开始变得明显,尤其是当底层流是MemoryStream
时(即您没有处理某些慢速设备I / O)。
更重要的是,我没有看到任何明确的优势在此处使用同一个流上的多个BinaryWriter
实例。似乎自然,可读,易于维护的事情是创建单个BinaryWriter
并重复使用它直到您完成写作。
为什么要避免将其作为参数传递?您已经通过了Stream
。只需通过BinaryWriter
即可。如果您确实需要直接访问基础流,则始终可以通过BinaryWriter.BaseStream
获取。
结论:我不能说你的提案本身有任何明显错误的内容。但是,如果没有(对我来说,无论如何)明显的好处,它是偏离正常惯例的。如果你有这样做的非常好的理由,它应该工作。但我建议反对它。