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

本文关键字:复制 BinaryWriter BaseStream 数据 MemoryStream | 更新日期: 2023-09-27 18:20:29

我在MemoryStream中有一堆数据,我想将所有数据写入BinaryWriter

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

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

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

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

如果你不想破坏你在初始流中的数据,就不会这样做:

        var myStreamInitially = new MemoryStream();
        var myStreamClone = new MemoryStream();
        myStreamInitially.CopyTo(myStreamClone);
        var binaryWriteb = new BinaryWriter(myStreamClone);

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

更新

这不是比更改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.

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

  1. 您将在单线程上下文中使用它。要么没有其他线程,要么在调用此时对编写器具有独占锁定。。。以及
  2. 在直接写入BaseStream之前,您先在编写器上调用Flush。写入程序可能缓冲了一些尚未写入流的数据

所以你修改后的代码是:

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