我可以在同一个Stream上使用多个BinaryWriters吗?

时间:2016-08-26 01:15:07

标签: c# .net

我可以创建一个新的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");
    }
}

1 个答案:

答案 0 :(得分:2)

  

这对BinaryWriter的使用是错误的吗?

应该可以正常工作。 BinaryWriter本身不进行缓冲,因此每个实例都不会干扰其他实例写入的数据。您正在为true参数传递leaveOpen,因此当处置每个实例时,它都不会关闭基础流。

但是"错误"在某种程度上是旁观者的眼睛。我会说最好通过BinaryWriter

MemoryStream没有被缓冲,但其他类型是。 BinaryWriter的每个实例,当它被处置时,将刷新流。有些人认为这可能效率低下,因为它至少部分地否定了缓冲的好处。这里不是问题,但可能不是最好的习惯。

此外,BinaryWriter的每个实例都将为垃圾收集器创建额外的工作。如果真的只有少数几个,那可能不是问题。但是,如果真实世界的示例涉及更多的调用,那么这可能会开始变得明显,尤其是当底层流是MemoryStream时(即您没有处理某些慢速设备I / O)。

更重要的是,我没有看到任何明确的优势在此处使用同一个流上的多个BinaryWriter实例。似乎自然,可读,易于维护的事情是创建单个BinaryWriter并重复使用它直到您完成写作。

为什么要避免将其作为参数传递?您已经通过了Stream。只需通过BinaryWriter即可。如果您确实需要直接访问基础流,则始终可以通过BinaryWriter.BaseStream获取。

结论:我不能说你的提案本身有任何明显错误的内容。但是,如果没有(对我来说,无论如何)明显的好处,它是偏离正常惯例的。如果你有这样做的非常好的理由,它应该工作。但我建议反对它。