3

我在 a 中有一堆数据,MemoryStream我想将它们全部写入BinaryWriter.

幸运的是,所有流现在都有一个Stream.CopyTo(Stream)方法,我可以从BinaryWriter.BaseStream属性中获取目标流。

public void WriteTo(BinaryWriter writer)
{
    this.memoryStream.CopyTo(writer.BaseStream);
}

我可以像这样安全地绕过编写器并将其直接复制到基本流,还是会弄乱编写器的缓冲区、位置或其他东西?或者,您如何建议将 a 复制Stream到 a BinaryWriter

4

2 回答 2

2

如果您不想弄乱初始流中的数据,则不会像这样工作:

        var myStreamInitially = new MemoryStream();
        var myStreamClone = new MemoryStream();

        myStreamInitially.CopyTo(myStreamClone);

        var binaryWriteb = new BinaryWriter(myStreamClone);

如果您使用的是 .NET 4+,则 CopyTo 方法非常方便。

更新

这难道不是比更改 binaryStream 底层 baseStream 更安全吗:

    void WriteToStreamInUnknownStatus(BinaryWriter binaryWriter)
    {
        var myStream = new MemoryStream();

        try
        {
            binaryWriter.Write(myStream.ToArray());
        }
        catch
        { }
    }

更新 2

如果你尝试这个,你会得到一个异常:“内存流不可解释”

   static void Main(string[] args)
    {
        var binaryWrite = new BinaryWriter(new MemoryStream(new byte[] {1, 2, 3, 4}));

        binaryWrite.Seek(3, SeekOrigin.Begin);

        var position = binaryWrite.BaseStream.Position;

        new MemoryStream(new byte[] {1, 2, 3, 4}).CopyTo(binaryWrite.BaseStream);

        position = binaryWrite.BaseStream.Position;
    }

因此,除了必须确保该属性是线程安全的之外,您还需要知道内部流的类型。冒着 IMO 的风险。

于 2013-06-28T19:14:21.400 回答
2

您的建议是安全的,前提是:

  1. 您在单线程上下文中使用它。要么没有其他线程,要么在你调用它的时候你对作者有一个排他锁。... 和
  2. Flush直接写信给BaseStream. writer 可能会缓冲一些尚未写入流的数据。

所以你修改后的代码是:

public void WriteTo(BinaryWriter writer)
{
    writer.Flush();
    this.memoryStream.CopyTo(writer.BaseStream);
}
于 2013-06-28T21:19:03.533 回答