BinaryReader 没有 EndOfStream 属性。使用以下代码检查是否到达流结束是否安全?
reader.BaseStream.Length>reader.BaseStream.Position
BinaryReader 没有 EndOfStream 属性。使用以下代码检查是否到达流结束是否安全?
reader.BaseStream.Length>reader.BaseStream.Position
我发现最简单的方法是检查 BinaryReader 的 PeekChar() 方法的返回值。如果它返回 -1,那么您到达了流的末尾。
这取决于。有多种流类型没有实现 Length 或 Position 属性,您会得到 NotSupportedException。以网络流为例。当然,如果您要使用这样的流,那么您确实必须预先知道调用 BinaryReader.Read() 方法的频率。所以,是的,没关系。
这不能作为通用解决方案,因为它假定该BaseStream
值支持该Length
属性。许多Stream
实现不会,而是抛出一个NotSupportedException
. 特别是任何网络基础流,例如HttpRequestStream
和NetworkStream
我注意到,即使底层 BaseStream 支持查找,将 Position 与 Length 进行比较也不适用于 StreamReader。StreamReader 似乎从 BaseStream 缓冲了预读。这一定是 StreamReader 提供 EndOfStream 属性的原因,这是一件好事,我希望 BinaryReader 也这样做。
检查底层基本流上的这些值(长度和位置)计数 BinaryReader 的行为与 StreamReader 不同,即依赖 BinaryReader 仅从 BaseStream 中获取完成用户方法调用所需的确切字节数。据推测,如果 BinaryReader 实际上在内部以这种方式运行,这就是它不需要提供 EndOfStream 的原因,但我确实希望它确实提供了一个,以便我知道正在以独立于实现的方式为客户端正确处理文件结尾。
当然,Readers 不是 Streams,但就文件结束的行为而言,如果有一个通用接口可以让输入/输出类的客户端知道 A.end of file 是否是底层来源的合理概念数据,以及 B. 如果 A 是合理的,则当文件结束时发生。
检查 Streams CanSeek 属性。如果此属性返回 true,那么您可以将流 Length 与流的 Position 进行比较,以判断您是否位于流的末尾。如果此属性返回 false,那么这将不起作用。
对于网络流,您可能需要区分可用字节的末尾(另一端的客户端仍有更多要写入但还没有)和正在关闭的流。底层 Tcp 连接的 IsConnected 属性对于知道流何时关闭是不可靠的。可以枚举计算机具有的连接,并查看您正在使用的流是否在其中。这更可靠,但更复杂。当您无法阅读任何内容时,最好只处理 IOExceptions