11

任意のバイト数を最も効率的にスキップする方法はStream

EndOfStreamException可能であれば、ストリームの終わりをスキップしようとするときに、を取得またはスローしたいと思います。


私はReaderISO9660プリミティブデータ型のカスタムストリームを作成していますが、これには、小さい数(4)と大きい数(2048)のバイトの両方で、シーク可能なストリームとシーク不可能なストリームで多くのスキップが含まれる場合があります。Skip(int count)したがって、スキップされたバイトを読み取って破棄するよりも少し効率的な方法を実装したいと思います。

たとえば、シーク可能なストリームではそうするかもしれませんが、ストリームの終わりを超えてシークstream.Position += 4するときにこれはスローされませんEndOfStreamException。また、何かを読まずにそれをテストする方法がわかりません。シークできないストリームの場合、設定Positionはオプションではありませんが、大量のバイトを読み取ってから破棄し、未使用のバイト配列を割り当てることは非常に無駄に思えます。

4

1 に答える 1

11

代わりに、Win32APIへの1回の呼び出しを節約するをstream.Position += 4使用できます。stream.Seek(4, SeekOrigin.Current);

Lengthストリームがサポートされている場合は、いつでもストリームのプロパティを確認できます。サポートされていない場合は、ストリームから読み取ろうとする以外の方法はありません。実際、長さが不明なストリームでは、シークは本質的に読み取りです。

CanSeekがfalseの場合、読み取ることはできませんLength。その逆も同様です。

読み取り中の無駄なメモリについては、スキップしているバイト数を読み取る必要はありません。固定サイズのメモリ(大または小)を割り当てて、任意の長さに使用できます。そのサイズを超えてスキップする必要がある場合は、x / sizeブロックを読み取り、残りのx % sizeバイトを読み取るだけです。

于 2012-08-06T10:59:37.680 に答える