我只是在编写一个从一般流中读取数据的简单方法 - 这意味着它可能是FileStream或NetworkStream而不知道它的长度。我重复将流读入byte []并将数据推送到另一个流或其他任何流。我的问题是,我怎么能注意到流完成了?我试图在 读取 方法返回0时返回 - 这是正确的方法吗?它似乎可以读取文件,但有时会遇到从网络读取数据的问题。
答案 0 :(得分:5)
是的,重复调用Read
并在返回0时完成正确的方法。
网络流也可以这样做 - 它们将阻塞,直到收到任何数据或流被断开。查看Stream.Read
的文档:
仅当返回值为零时才返回零 位置目前正在结束 流。实施将 阻止至少一个字节的数据 如果没有数据,可以读取 是可用的。读取时仅返回0 流中没有更多数据 并且不再期待(例如a 关闭套接字或文件结尾)。
答案 1 :(得分:0)
对于网络流,如果Stream.ReadByte()返回小于0的任何内容,则表示该流已被读取到最后。
答案 2 :(得分:0)
正如Jon所说,你知道它是文件的结尾,因为它将返回0个字节。但是,您还必须考虑可以抛出的各种异常。由于网络固有地不可靠,因此总会有一些例外。
例如,如果流已断开连接(而另一方只是关闭套接字),则可能会收到IOException
异常。始终将I / O调用包装在异常处理程序中,除非您绝对确定它们不会抛出异常。