如何判断流已被读到最后?

时间:2009-04-05 15:59:35

标签: .net stream

我只是在编写一个从一般流中读取数据的简单方法 - 这意味着它可能是FileStream或NetworkStream而不知道它的长度。我重复将流读入byte []并将数据推送到另一个流或其他任何流。我的问题是,我怎么能注意到流完成了?我试图在 读取 方法返回0时返回 - 这是正确的方法吗?它似乎可以读取文件,但有时会遇到从网络读取数据的问题。

3 个答案:

答案 0 :(得分:5)

是的,重复调用Read并在返回0时完成正确的方法。

网络流也可以这样做 - 它们将阻塞,直到收到任何数据或流被断开。查看Stream.Read的文档:

  

仅当返回值为零时才返回零   位置目前正在结束   流。实施将   阻止至少一个字节的数据   如果没有数据,可以读取   是可用的。读取时仅返回0   流中没有更多数据   并且不再期待(例如a   关闭套接字或文件结尾)。

答案 1 :(得分:0)

对于网络流,如果Stream.ReadByte()返回小于0的任何内容,则表示该流已被读取到最后。

答案 2 :(得分:0)

正如Jon所说,你知道它是文件的结尾,因为它将返回0个字节。但是,您还必须考虑可以抛出的各种异常。由于网络固有地不可靠,因此总会有一些例外。

例如,如果流已断开连接(而另一方只是关闭套接字),则可能会收到IOException异常。始终将I / O调用包装在异常处理程序中,除非您绝对确定它们不会抛出异常。