我正致力于改进使用BinaryReader
的流阅读器类。它由一个while循环组成,它使用.PeekChar()
来检查是否存在更多数据以继续处理。
第一个操作是.ReadInt32()
,读取4个字节。如果PeekChar
仅“看到”一个字节(或一位)怎么办?这似乎不是检查EOF的可靠方法。
使用默认参数构造BinaryReader
,据我所知,它使用UTF8作为默认编码。我假设.PeekChar()
检查8位但我真的不确定。
.PeekChar()
寻找多少位? (以及检查EOF的其他方法有哪些?)
答案 0 :(得分:4)
我看了:
ArgumentException:当前字符无法解码为 使用为其选择的编码的内部字符缓冲区 流。
这表明读取的内存量取决于应用于该流的编码。
修改强>
实际上根据MSDN的定义是:
返回下一个可用的字符,但不会前进 字节 或 字符位置。*
事实上,如果这是一个或多个字节,则取决于编码...
希望这有帮助。
答案 1 :(得分:1)
盲目地进行Read*()
调用并处理抛出的异常是正常方法。如果出现任何问题,我不相信流位置会被移动。
答案 2 :(得分:0)
BinaryReader的PeekChar()方法非常错误。即使在尝试使用UTF8编码数据从内存流中读取a时,PeekChar()在读取特定长度的流后也会抛出异常。 BCL团队已经承认了这个问题,但他们并没有承诺解决这个问题。他们唯一的反应就是尽可能避免使用PeekChar()。