1

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

我有一个自定义内存流,我已经将 StreamReader 包裹起来,以便通过ReadToEnd(). 问题是它永远不会结束。它不断地调用我的ReadByte()函数,任何可以返回的值都可能是一个真正的值——所以与Read()我可以返回零来指示数据结束的函数不同,我在这里卡住了。的规范ReadByte()说它在数据末尾返回-1-但这不会导致ReadToEnd()停止。如果是这样,那就太没用了。

我在文档中只能找到“ReadToEnd 假设流知道何时结束”。但我看不到流是如何发出这种情况的信号的。

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


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

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

4

2 回答 2

1

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

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

于 2013-10-17T15:06:05.593 回答
0

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

于 2013-10-17T14:58:46.757 回答