我在MemoryStream中有一堆数据,我想将所有数据都写到BinaryWriter中。

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

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


我是否可以像这样安全地绕过编写器,然后将其直接复制到基本流中,否则这会破坏编写器的缓冲区,位置或其他内容吗?或者,您如何建议将Stream复制到BinaryWriter

最佳答案

如果您不想弄乱初始流中的数据,则不会执行以下操作:

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

        myStreamInitially.CopyTo(myStreamClone);

        var binaryWriteb = new BinaryWriter(myStreamClone);


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

更新

这不是比更改baseStream底层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的风险。

关于c# - 将数据从MemoryStream直接复制到BinaryWriter.BaseStream吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17369782/

10-09 03:06