为什么 FileStream.Length 是 long 类型,但 FileStream.Read 参数 - offset 的长度较短?
布莱恩
参数告诉从offset
哪里开始在数组中写入数据,array
参数。它没有指出文件数据中的偏移量。
offset参数给出了数组(缓冲区索引)中开始读取的字节的偏移量, count参数给出了要从此流中读取的最大字节数。返回值是实际读取的字节数,如果到达流的末尾则为零。如果读取操作成功,则流的当前位置提前读取的字节数。如果发生异常,则流的当前位置不变。
偏移量是放置数据的字节数组的索引。您不能分配大于 2 GB 的数组,因此偏移量不需要更大的数字。
我假设您指的是从基类覆盖的这个Stream
方法。
偏移量是array
参数中放置字节的位置,而不是从FileStream
. array
参数的类型不能byte[]
超过int.MaxValue
元素。
作为 mike z 答案的补充,为什么 byte[] 的索引不能超过 int.MaxValue - 类 Array 用object this[int index] { get; set; }
方法实现 IList,因此索引只能是整数。
FileStream.Length 获取流的字节长度,FileStream.Read 从流中读取一个字节块。因此,从逻辑上讲,您将拥有比该字节块更多的单个字节。我假设出于这个原因 FileStream.Length 需要长类型。
FileStream 扩展 Stream,
Stream 可以处理多个 byte[int.MaxValue] 数组,并且它们一起具有很长的长度。
但是当你使用 Read 时,你可以用 int.MaxValue 将它的一部分读到一个字节数组中。
考虑一下,如果您想从磁盘读取大于 2G = int.MaxValue 的文件,则需要以 byte[int.MaxValue] 块的形式读取它
(: