Filestream.Read的返回值是什么意思? 如何以块的forms读取数据并进行处理?

我对C#很新,所以请耐心等待。 我正在读取(使用FileStream)数据(固定大小)到小数组,处理数据然后再读取,依此类推到文件末尾。

我想过用这样的东西:

byte[] data = new byte[30]; int numBytesToRead = (int)fStream.Length; int offset = 0; //reading while (numBytesToRead > 0) { fStream.Read(data, offset, 30); offset += 30; numBytesToRead -= 30; //do something with the data } 

但我检查了文档及其示例,他们表示上述读取方法的返回值为:

“类型:System.Int32读入缓冲区的总字节数。如果该字节数当前不可用 ,则可能小于请求的字节数,如果到达流末尾则为零。”

它们目前不可用是什么意思,这在读取少量数据时是否真的会发生,或者这只是大量数据? 如果只是为了大,大约有多大,因为我也会在其他地方阅读更大的块。 如果这种情况随时可能发生,我应该如何更改代码,以便代码仍能有效执行?

谢谢你的时间和答案。

read方法返回返回的字节数,可能小于请求的字节数。 通常,当您读取文件时,您将获得您要求的所有字节(除非您到达文件的末尾),但是,您不能指望它始终如此。

系统可能会在立即可用的数据和需要时间检索的数据之间产生差异,以便它立即返回当前可用的数据,开始在后台读取更多数据并期望您请求其余数据另一个电话中的数据。 AFAIK目前没有这样做,但这是一个合理的未来情景。

您应该获得Read方法的结果并使用它来确定您获得了多少数据。 您不应该在offset位置将其读入缓冲区,然后您无法读取大于缓冲区的文件。 或者,您可以声明一个数组来保存整个流,然后您将数据读入offset的位置。

您还应该处理Read方法返回零的情况,这意味着没有更多数据要读取。 这通常不会发生,直到你到达文件的末尾,但如果它会将你的代码扔进一个永恒的循环。

 byte[] data = new byte[30]; int numBytesToRead = (int)fStream.Length; int offset = 0; //reading while (numBytesToRead > 0) { int len = fStream.Read(data, 0, data.Length); offset += len; numBytesToRead -= len; if (len == 0 && numBytesToRead > 0) { // error: unexpected end of file } //do something with the data (len bytes) } 

尝试阅读超过文件中可用的内容。 您可以在以下两种方案中执行此操作:

  • 您尝试读取的字节数多于文件的总长度
  • 您太靠近文件的末尾,无法读取您请求的字节数

此外,Stream还具有网络绑定连接的后代,在这些情况下,要知道可用的字节数和时间并不总是很容易。

以块为单位处理二进制文件的方法如下:

 byte[] buffer = new byte[BUFFER_SIZE]; int inBuffer; while ((inBuffer = stream.Read(buffer, 0, buffer.Length)) > 0) { // here you have "inBytes" number of bytes in the buffer } 

当前不可用的字节仅适用于非FileStream流,例如HttpWebRequest中的流。

理论上,FileStream.Read可以返回1个字节。 您仍然可以处理这么小的数据包。

但它永远不会返回0,除非出现SMB连接丢失,文件删除,反病毒或文件结束等问题。

有更好的方法来读取文件。 如果您正在处理文本文件,请考虑使用System.IO.StreamReader,因为它处理不同的文本编码,换行符等。

还要注意缓冲区最大大小是2 GB,所以不要做new buffer[fileStream.Length]

FileStream派生自StreamStream是一个非常通用的类,Read的描述来自该generics类。 例如,流也可以是网络流,在那里,数据当前可能不可用,因为它尚未被发送。 对于FileStream您可以假设您将获得三种类型的返回值:

  1. 返回值==要读取的字节数(读取的最后一个参数):您位于文件的中间
  2. 返回值 0:您可能位于文件的末尾,或者流的其余部分当前不可用。
  3. 返回值== 0:您已经阅读了所有内容。 没什么好看的了。