用于BinaryReader的EndOfStream

时间:2010-09-20 15:31:45

标签: c# streaming binaryreader

BinaryReader没有EndOfStream属性。使用以下代码来检查是否到达流的末尾是否安全?

reader.BaseStream.Length>reader.BaseStream.Position

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

这取决于。有各种流类型没有实现Length或Position属性,你会得到一个NotSupportedException。例如NetworkStream。当然,如果你使用这样的流,那么你真的必须事先知道调用BinaryReader.Read()方法的频率。所以,是的,没关系。

答案 2 :(得分:2)

这不能作为一般解决方案,因为它假定BaseStream值支持Length属性。很多Stream实现都没有,而是抛出NotSupportedException。特别是任何网络基本流,例如HttpRequestStreamNetworkStream

答案 3 :(得分:1)

我注意到,即使底层BaseStream支持搜索,比较Position和Length也不适用于StreamReader。似乎StreamReader缓冲了从BaseStream的预读。这必须是StreamReader提供EndOfStream属性的原因,这是一件好事,我希望BinaryReader做同样的事情。

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

当然读者不是Streams,但是对于文件结束行为,如果有一个通用接口使输入/输出类的客户端能够知道文件的末尾是否是一个合理的概念,那将会很好。潜在的数据来源,以及B.如果A是明智的,则在文件结束时发生。

答案 4 :(得分:0)

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

对于网络流,您可能需要区分可用字节的结尾(另一端的客户端仍有更多要写但尚未编写)并且流被关闭。底层Tcp连接的IsConnected属性对于知道流何时关闭是不可靠的。可以枚举计算机具有的连接,并查看您使用的流是否在其中。这更可靠,但更复杂。当您无法读取任何

时,最好只处理IOExceptions

答案 5 :(得分:-1)

这就是我过去一直做的事情,我从来没有看到它的问题。使用它的代码已经在生产环境中使用了2年多。