将数据从MemoryStream直接复制到BinaryWriter.BaseStream?

时间:2013-06-28 16:48:45

标签: c# stream memorystream binarywriter

我在MemoryStream中有大量数据,我想将所有数据写入BinaryWriter

幸运的是,现在所有流都有Stream.CopyTo(Stream) method,我可以从BinaryWriter.BaseStream property获取目标流。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

        myStreamInitially.CopyTo(myStreamClone);

        var binaryWriteb = new BinaryWriter(myStreamClone);

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

<强>更新

这不比更改baseStream底层的binaryStream更安全:

    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带来风险。

答案 1 :(得分:2)

您提出的建议是安全的,但是:

  1. 您在单线程上下文中使用它。要么没有其他线程,要么在您调用它时对作者有独占锁定。 ......和
  2. 在直接写入Flush之前,您在作者上致电BaseStream。编写器可以缓存一些尚未写入流的数据。
  3. 所以修改后的代码是:

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