BinaryReader没有EndOfStream属性。使用以下代码来检查是否到达流的末尾是否安全?
reader.BaseStream.Length>reader.BaseStream.Position
答案 0 :(得分:10)
我找到的最简单的方法是检查BinaryReader的PeekChar()方法的返回值。如果它返回-1,那么你到达了流的末尾。
答案 1 :(得分:7)
这取决于。有各种流类型没有实现Length或Position属性,你会得到一个NotSupportedException。例如NetworkStream。当然,如果你使用这样的流,那么你真的必须事先知道调用BinaryReader.Read()方法的频率。所以,是的,没关系。
答案 2 :(得分:2)
这不能作为一般解决方案,因为它假定BaseStream
值支持Length
属性。很多Stream
实现都没有,而是抛出NotSupportedException
。特别是任何网络基本流,例如HttpRequestStream
和NetworkStream
答案 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年多。