EndOfStreamforBinaryReaderBinaryReader没有EndOfStream属性。使用以下代码检查是否已到达流的末尾是否安全?reader.BaseStream.Length>reader.BaseStream.Position这取决于。有多种流类型未实现Length或Position属性,您将获得NotSupportedException。例如网络流。当然,如果您使用这样的流,那么您确实必须提前知道调用BinaryReader.Read()方法的频率。所以,是的,没关系。我发现的最简单的方法是检查BinaryReader的PeekChar()方法的返回值。如果它返回-1,那么您到达了流的末尾。这不能用作通用解决方案,因为它假定BaseStream值支持Length属性。许多Stream实现不会抛出NotSupportedException。特别是任何网络基本流,如HttpRequestStream和NetworkStream我注意到比较Position和Length不适用于StreamReader,即使底层BaseStream支持搜索。StreamReader似乎缓冲了BaseStream的预读。这一定是StreamReader提供EndOfStream属性的原因,这是一件好事,我希望BinaryReader也这样做。检查底层基本流上的这些值(长度和位置)会使BinaryReader计算不像StreamReader,即依赖BinaryReader仅从BaseStream获取完成用户方法调用所需的确切字节数。假设BinaryReader实际上在内部以这种方式运行,这就是为什么它不需要提供EndOfStream的原因,但我确实希望它提供一个,以便我知道以独立于实现的方式为客户端正确处理文件结束.当然,读者不是Streams,但对于文件结束行为,如果有一个通用接口可以让输入/输出类的客户端知道文件结束是否是一个明智的概念,那就太好了。如果A合理,则数据出现在文件末尾和B。查看StreamsCanSeek属性。如果此属性返回true,您可以将流长度与流位置进行比较,以查看您是否处于流的末尾。如果此属性返回false,则该操作无效。对于网络流,您可能需要区分可用字节结束(另一端的客户端仍有更多要写入但尚未写入)和正在关闭的流。底层Tcp连接的IsConnected属性对于了解流何时关闭是不可靠的。您可以枚举您的计算机拥有的连接,并查看您正在使用的流是否在其中。这更可靠,但更复杂。当您无法读取任何内容时,最好只处理IOExceptions。这就是我过去一直在做的事情,而且我从未见过它有问题。使用它的代码已经投入生产超过2年。以上就是C#学习教程:EndOfStreamforBinaryReader分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
