[英]What does Filestream.Read return value mean? How to read data in chunks and process it?
我对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
派生自Stream
, Stream
是一个非常通用的类,Read的描述来自该泛型类。 例如,流也可以是网络流,在那里,数据可能当前不可用,因为它尚未被发送。 对于FileStream
您可以假设您将获得三种类型的返回值:
当前不可用的字节仅适用于非FileStream流,例如在HttpWebRequest中找到的流。
理论上,FileStream.Read可以返回1个字节。 您仍然可以处理这么小的数据包。
但它永远不会返回0,除非出现SMB连接丢失,文件删除,反病毒或文件结束等问题。
有更好的方法来读取文件。 如果您正在处理文本文件,请考虑使用System.IO.StreamReader,因为它处理不同的文本编码,换行符等。
还要注意缓冲区最大大小为2 GB,所以不要做new buffer[fileStream.Length]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.