c#.net中的Stream.read()方法中的问题

时间:2010-09-16 12:36:36

标签: c# stream

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);

程序没有响应

问题是什么?

3 个答案:

答案 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;
    }