3

に大量のデータがあり、そのMemoryStreamすべてを に書き込みたいと考えていBinaryWriterます。

幸運なことに、すべてのストリームにStream.CopyTo(Stream)メソッドがあり、BinaryWriter.BaseStreamプロパティから対象のストリームを取得できます。

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

このようにライターを安全にバイパスしてベース ストリームに直接コピーできますか、それともライターのバッファー、位置、またはその他の何かを台無しにしますか? Streamまたは、 aを 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 メソッドは非常に便利です。

アップデート

これは 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を危険にさらす。

于 2013-06-28T19:14:21.400 に答える