2

IInputStream特定のバイトに遭遇するまでデータを読み取りたいがあり、その時点で をIInputStream他のオブジェクトに渡して残りのストリームを消費します。

これは私が思いついたものです:

public async Task HandleInputStream(IInputStream instream)
{
    using (var dataReader = new DataReader(instream))
    {
        byte b;
        do
        {
            await dataReader.LoadAsync(1);
            b = dataReader.ReadByte();

            // Do something with the byte
        } while (b != <some condition>);

        dataReader.DetachStream();
    }
}

一度に 1 バイトずつ実行LoadDataすると、非常に遅くなるようです。私のジレンマは、バッファ サイズ (1024 など) を選択してそれをロードすると、値が 10 バイトになると、このメソッドには次の 1014 バイトのデータが含まれ、処理のために次のメソッドに渡す必要があることです。 .

これにアプローチするより良い方法はありますか、それともこれは受け入れられる解決策ですか?

4

1 に答える 1

2

探している値がストリームの先頭からそれほど離れていない場合、この種の読み取りはそれほど遅くはありません。ストリームのどこまでを期待していますか? パフォーマンスをテストしましたか?

使用しているストリームのタイプによっては、他のアプローチを使用できる場合があります。

  • 後方シークをサポートしている場合 (たとえば、ファイルから読み取る場合)、値を見つけたオフセットがわかっている限り、一度に大きなチャンクを読み取ることができます。その後、ハンドオフする前に、その位置までストリームをシークできます。
  • それが不可能な場合は、別の中間メモリ ストリームを作成して、既に読み取ったバッファの残りの部分をコピーし、その後に残りのストリームをコピーすることができます。これは、逆方向にシークできない場合でも機能します。ストリームが大きすぎる場合の唯一の問題は、メモリの消費です。
于 2012-11-30T05:47:50.680 に答える