4

私は最近、このWebページhttp://www.yoda.arachsys.com/csharp/readbinary.htmlに出くわし、ファイルストリームから読み取るときに取るべき注意事項を説明しています。その要点は、次のコードが常に機能するとは限らないということです。

// Bad code! Do not use!
FileStream fs = File.OpenRead(filename);
byte[] data = new byte[fs.Length];
fs.Read (data, 0, data.Length);

Readの3番目の引数は読み取られる最大バイト数であるため、これは危険です。Readの戻り値を使用して、実際に読み取られた量を確認する必要があります。

私の質問は、メモリストリームから読み取るときに同じ予防策を講じる必要があり、どのような状況ですべてのバイトが読み取られる前に読み取りが返される可能性があるかということです。

4

4 に答える 4

7

ええと、 の現在の実装は、MemoryStream可能な場合は常にバッファを埋めると思います-それから派生した邪悪なクラスを持っていない限り。私が見る限り、それは保証されていません。ドキュメントには次の警告も含まれています。

実装は、ストリームの終わりに達していなくても、要求されたよりも少ないバイト数を自由に返すことができます。

個人的には、物事がはるかに簡単にならない限り、私は常にこれを防御的にコーディングします。誰かがいつストリームの種類を変更し、何が起こったかに気付かないかはわかりません。

ただし、通常はMemoryStreamすべてのバイトを一度に取得したいので、 を呼び出しますMemoryStream.ToArray。これは動作することが保証されており、誰かが a を使用しないようにコードを変更するとMemoryStream、そのメンバーの唯一の on としてコンパイルに失敗しますMemoryStream。一般的なストリームの場合、ストリームから完全に読み取り、バイト配列を返すユーティリティ メソッドを使用します。

于 2009-09-18T15:13:46.270 に答える
1

普通の理由が思い浮かびませんMemoryStream。管理されていない場合は、別の話かもしれません。

とにかく、コマンドは常に便利です。:)GetBuffer() ToArray()

于 2009-09-18T15:15:27.860 に答える
0

これについてMSDNは次のように述べています。

...そのバイト数が現在利用できない場合は、要求されたバイト数よりも少なくなる可能性があります。バイトが読み取られる前にストリームの終わりに達した場合はゼロになります。

実装は、ストリームの終わりに達していなくても、要求されたよりも少ないバイト数を自由に返すことができます。

「実装...」という用語に注意してください。

于 2009-09-18T15:16:48.760 に答える
0

はい、呼び出し時にストリームから実際に読み取られたバイト数を常に認識しておく必要がありますRead。ルーティングの原因はストリームの種類によって異なりますが、基本的に、ストリームの末尾を超えて読み取ろうとすると、戻り値は実際のバッファー サイズよりも小さくなります。

于 2009-09-18T15:15:01.340 に答える