StreamReader.ReadToEnd最终如何知道它?

时间:2013-10-17 14:44:59

标签: .net streamreader

[这是一个红色的鲱鱼 - 抱歉浪费了人们的时间。虽然这些信息可能对其他人有用。]

我有一个自定义内存流,我已经将StreamReader包装好,以便通过ReadToEnd()轻松读取一些文本。问题是它永远不会完成。它连续调用我的ReadByte()函数,任何可以返回的值都可以是实数值 - 所以与Read()函数不同,我可以返回零来指示数据的结束,这里我卡住了。 ReadByte()的规范表示它在数据末尾返回-1,但这不会导致ReadToEnd()停止。如果确实如此,它将毫无用处。

我在文档中找到的只是“ReadToEnd假设流知道它何时到达终点。”但是我没有看到流如何发出信号。

如果ReadByte()在到达流末尾时抛出异常,则我将分配输出的变量永远不会被设置,因为StreamReader没有捕获异常。那么它从它下面的流中寻找什么条件来告诉它它已到达流的末尾?


在所有评论和更多挖掘之后,问题变成了我忘记的中间流,其中read()正在调用子流readbyte并将返回的数据写入数组。感谢其中一条评论,当我发现我能够首先将int读入一个变量来检查它是否是一个int -1而不是一个字节-1来决定是继续写入数组还是退出因为没有更多数据。

所以我的问题的答案是信号是Read()返回零,如果你看到ReadByte在任何地方被调用,那么这就是开始怀疑的地方。

2 个答案:

答案 0 :(得分:1)

如果您要创建自定义Stream实施,则应覆盖Read(byte[], int, int)而不是ReadByte()ReadByte()的默认实现只是将Read(buffer, 0, 1)作为实用方法调用。

StreamReader将在底层流上调用Read(byte[], int, int)。正确实现此方法,以便在到达流末尾时返回0以解决问题。

答案 1 :(得分:0)

如果您阅读了代码,您会看到信号Stream.Read返回0。