11

FileStream.Lengthがlong型であるのに、FileStream.Read引数-offsetの長さintが短いのはなぜですか?

ブライアン

4

6 に答える 6

6

オフセットは、データが配置されるバイト配列へのインデックスです。2 GBを超えるアレイを割り当てることはできないため、オフセットにこれより大きな数を割り当てる必要はありません。

于 2012-11-27T07:30:07.720 に答える
6

このoffsetパラメーターは、配列内のデータの書き込みを開始する場所、arrayパラメーターを示します。ファイルデータのオフセットを示すものではありません。

offsetパラメーターは、読み取りを開始する配列内のバイトのオフセット(バッファー・インデックス)を示し、countパラメーターは、このストリームから読み取られる最大バイト数を示します。戻り値は、実際に読み取られたバイト数、またはストリームの終わりに達した場合はゼロです。読み取り操作が成功すると、ストリームの現在の位置が読み取られたバイト数だけ進みます。例外が発生した場合、ストリームの現在の位置は変更されません。

ソース:FileStream.Read

于 2012-11-27T07:28:28.010 に答える
1

FileStream.Lengthはストリームのバイト単位の長さを取得し、FileStream.Readはストリームからバイトのブロックを読み取ります。したがって、論理的には、そのバイトのブロックよりも多くの単一バイトがあります。このため、FileStream.Lengthには長い型が必要だと思います。

于 2012-11-27T07:37:19.897 に答える
1

mike zの回答に加えて、byte []に​​int.MaxValueを超えてインデックスを付けることができない理由-クラスArrayはobject this[int index] { get; set; }メソッドを使用してIListを実装するため、インデックスは整数のみにすることができます。

于 2012-11-27T07:31:48.607 に答える
1

基本クラスからオーバーライドされるこのメソッドを参照していると想定していますStream

arrayオフセットは、の先頭からのオフセットではなく、バイトを配置する引数内の位置FileStreamです。array引数は、要素をbyte[]超えることはできない型です。int.MaxValue

于 2012-11-27T07:29:21.877 に答える
0

ストリームを拡張するFileStream、

Streamは、byte [int.MaxValue]配列の数を処理でき、それらを合わせると長さが長くなります。

ただし、Readを使用すると、int.MaxValueを使用してその一部のみをバイト配列に読み取ることができます。

ディスクから2G=int.MaxValueより大きいファイルを読み取る場合は、byte[int.MaxValue]のチャンクで読み取る必要があることを考慮してください。

(:

于 2020-12-02T13:01:50.037 に答える