11

BinaryReader 没有 EndOfStream 属性。使用以下代码检查是否到达流结束是否安全?

reader.BaseStream.Length>reader.BaseStream.Position

4

5 回答 5

10

我发现最简单的方法是检查 BinaryReader 的 PeekChar() 方法的返回值。如果它返回 -1,那么您到达了流的末尾。

于 2010-11-03T13:31:46.727 回答
7

这取决于。有多种流类型没有实现 Length 或 Position 属性,您会得到 NotSupportedException。以网络流为例。当然,如果您要使用这样的流,那么您确实必须预先知道调用 BinaryReader.Read() 方法的频率。所以,是的,没关系。

于 2010-09-20T15:35:50.757 回答
3

这不能作为通用解决方案,因为它假定该BaseStream值支持该Length属性。许多Stream实现不会,而是抛出一个NotSupportedException. 特别是任何网络基础流,例如HttpRequestStreamNetworkStream

于 2010-09-20T15:35:46.957 回答
1

我注意到,即使底层 BaseStream 支持查找,将 Position 与 Length 进行比较也不适用于 StreamReader。StreamReader 似乎从 BaseStream 缓冲了预读。这一定是 StreamReader 提供 EndOfStream 属性的原因,这是一件好事,我希望 BinaryReader 也这样做。

检查底层基本流上的这些值(长度和位置)计数 BinaryReader 的行为与 StreamReader 不同,即依赖 BinaryReader 仅从 BaseStream 中获取完成用户方法调用所需的确切字节数。据推测,如果 BinaryReader 实际上在内部以这种方式运行,这就是它不需要提供 EndOfStream 的原因,但我确实希望它确实提供了一个,以便我知道正在以独立于实现的方式为客户端正确处理文件结尾。

当然,Readers 不是 Streams,但就文件结束的行为而言,如果有一个通用接口可以让输入/输出类的客户端知道 A.end of file 是否是底层来源的合理概念数据,以及 B. 如果 A 是合理的,则当文件结束时发生。

于 2013-12-16T17:09:15.233 回答
0

检查 Streams CanSeek 属性。如果此属性返回 true,那么您可以将流 Length 与流的 Position 进行比较,以判断您是否位于流的末尾。如果此属性返回 false,那么这将不起作用。

对于网络流,您可能需要区分可用字节的末尾(另一端的客户端仍有更多要写入但还没有)和正在关闭的流。底层 Tcp 连接的 IsConnected 属性对于知道流何时关闭是不可靠的。可以枚举计算机具有的连接,并查看您正在使用的流是否在其中。这更可靠,但更复杂。当您无法阅读任何内容时,最好只处理 IOExceptions

于 2016-01-03T00:31:58.940 回答