public static void ReadWholeArray (Stream stream, byte[] data)
{
int offset=0;
int remaining = data.Length;
while (remaining > 0)
{
int read = stream.Read(data, offset, remaining);
if (read <= 0)
throw new EndOfStreamException(String.Format("End of stream reached with {0} bytes left to read", remaining));
remaining -= read;
offset += read;
}
}
字节数组数据的大小为2682 在while循环的第一次迭代 read的值是1658 在下一次迭代 执行行
后int read = stream.Read(data, offset, remaining);
程序没有响应
问题是什么?
答案 0 :(得分:1)
在数据可用之前,无论提供哪种流都会阻塞。来自MSDN的Stream.Read文档:
实施将阻止,直到 可以读取至少一个字节的数据 没有数据可用的事件。 只有在没有时,读取才返回0 流中的更多数据,而不再是 预期的(例如封闭的插座或 文件结束)
您可以在流上设置读取超时,以防止永久阻止。
顺便说一句,请注意从流中读取将移动当前位置,因此使用偏移逻辑可能会跳过输入流的大块。
答案 1 :(得分:0)
您尚未在流中设置ReadTimeout且没有数据,因此在数据可用之前,调用将阻塞。
检查Stream .ReadTimeout和.WriteTimeout的属性。
另外,请记住,您知道所需的数据,但不知道会有多少数据(失败,错误等),所以您也应该检查一下。
答案 2 :(得分:-1)
你可以试试这个。此代码将从流中读取字节到byte []:
public static byte[] GetBytesFromStream()
{
FileStream fs = new FileStream("d:/pic.jpg", FileMode.Create);
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, (int)fs.Length);
fs.Close();
return bytes;
}