1. ホーム
  2. c#

.NETでStreamからMemoryStreamを取得する方法は?

2023-07-16 01:31:23

質問

次のようなコンストラクタ・メソッドがあります。 MemoryStream をファイルパスから開きます。

MemoryStream _ms;

public MyClass(string filePath)
{
    byte[] docBytes = File.ReadAllBytes(filePath);
    _ms = new MemoryStream();
    _ms.Write(docBytes, 0, docBytes.Length);
}

を受け入れるように変更する必要があります。 Stream を受け入れるように変更する必要があります。最も簡単で最も効率的な方法は何でしょうか? MemoryStream から Stream オブジェクトを作成しますか?

どのように解決するのですか?

ファイル名ではなくストリームを受け取るようにクラスを修正する場合、わざわざMemoryStreamに変換する必要はないでしょう。基礎となるStreamに操作を任せてください。

public class MyClass
{ 
    Stream _s;

    public MyClass(Stream s) { _s = s; }
}

しかし、内部操作のために本当にMemoryStreamが必要な場合、ソースStreamからMemoryStreamにデータをコピーする必要があります。

public MyClass(Stream stream)
{
    _ms = new MemoryStream();
    CopyStream(stream, _ms);
}

// Merged From linked CopyStream below and Jon Skeet's ReadFully example
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[16*1024];
    int read;
    while((read = input.Read (buffer, 0, buffer.Length)) > 0)
    {
        output.Write (buffer, 0, read);
    }
}