假设我们有一个这样的代码块:
//Assuming s is a stream:
byte[] data = new byte[1000];
s.Read(data,0,data.Length);
Run Code Online (Sandbox Code Playgroud)
read方法可以读取1到1000个字节的任何位置,使得流的余额未读.
这是C#书中所说的.
我不明白,为什么Read方法会从流中读取?它不是在阅读所有的流吗?
它说解决办法应该是这样的:
//bytesRead will always end up at 1000, unless the stream is itself smaller in length:
int bytesRead = 0;
int chunkSize = 1;
while(bytesRead < data.Length && chunkSize > 0 )
bytesRead += chunkSize = s.Read(data,bytesRead,dataLength-bytesRead);
Run Code Online (Sandbox Code Playgroud)
上面的代码也是本书提供的一种解决方法.我试图了解Read方法是否开始读到最后并将指定范围内的所有字节写入字节数组.他为什么用它bytesRead作为起点s.Read(data,bytesRead,dataLength-bytesRead);
提前致谢.
我们的想法是,在您调用Read或者永远时,数据可能无法使用.例如,在NetworkStream上,数据的到达速度可能比您提取的速度慢.或者您可能接近FileStream的末尾.Stream可能知道剩余的字节数比您要求的少,或者它可能无法知道何时或是否将满足所请求字节的完整重击.因此,不是等待可能永远不会到达的数据,或者因"没有足够的字节,再次猜测"错误而失败,Read会保留返回少于您要求的权利.
因此,在将块读入字节数组时,可能无法填充字节数组.但是你希望将下一个块附加到最后一个块的位置,而不是覆盖字节数组的开头.因此传递bytesRead作为将下一个块放入字节数组的起始位置.