【发布时间】:2009-04-05 15:59:35
【问题描述】:
我只是在编写一个简单的方法,从一般流中读取数据——这意味着它可能是 FileStream 或 NetworkStream 而不知道它的长度。我反复将流读入 byte[] 并将数据推送到另一个流或其他任何东西。我的问题是,我怎么能注意到流已经结束了?当 Read 方法返回 0 时,我尝试返回 - 这是正确的方法吗?读取文件好像没问题,但有时会遇到从网络读取数据的问题。
【问题讨论】:
我只是在编写一个简单的方法,从一般流中读取数据——这意味着它可能是 FileStream 或 NetworkStream 而不知道它的长度。我反复将流读入 byte[] 并将数据推送到另一个流或其他任何东西。我的问题是,我怎么能注意到流已经结束了?当 Read 方法返回 0 时,我尝试返回 - 这是正确的方法吗?读取文件好像没问题,但有时会遇到从网络读取数据的问题。
【问题讨论】:
是的,重复调用Read 并在它返回 0 时结束是完全正确的方法。
网络流也可以这样做 - 它们会阻塞,直到接收到任何数据或流断开连接。查看Stream.Read的文档:
只有当 位置目前在末尾 流。实施将 阻塞直到至少一个字节的数据 可以读取,在没有数据的情况下 可用。读取仅在以下情况下返回 0 流中没有更多数据 并且没有更多的预期(例如 关闭套接字或文件结尾)。
【讨论】:
对于网络流,如果 Stream.ReadByte() 返回小于 0 的值,则表明流已读到末尾。
【讨论】:
正如 Jon 所说,您知道这是文件的结尾,因为它将返回 0 个字节。但是,您还必须考虑可能引发的各种异常。因为网络本质上是不可靠的,所以总会有一些例外。
例如,如果流断开连接(与另一端简单地关闭套接字相反),那么您可能会收到IOException 异常。始终将 I/O 调用包装在异常处理程序中,除非您绝对确定它们不会引发异常。
【讨论】: