推回缓冲区溢出 - 但我的缓冲区还没有满?

3
我正在实现一个语法阅读器,这是从一个作业中分离出来的,我正在逐个字符读取XML文件。我的目标是采用我通过实验室作业的代码,并改进结构和设计。
我有一个继承自PushbackReader的SyntaxReader,它具有一些额外的方法,例如readAndExpect(char c),trimWhitespace()和readUntilChar(char c)。然后我有一个XMLSyntaxReader,它继承自SyntaxReader并添加了功能,如readAttribute()和readNode()(对于树中的子节点进行递归...)。
我基本上只是将工作的代码从我的实验室作业中复制并粘贴到了这个方法的适当位置。但是,当我尝试读取第一个子元素时,我得到了一个IOException: Pushback buffer overflow,我无法解决。
这是我的XML文件的开头:
<Biosfar namn="Liv">ar allt som fortplantar sig
    <Rike namn="Vaxter"> etc...

我已经进行了调试,并观察到语法读取器成功地读取了子标签开头的<R。此时,XMLSyntaxReader确认它是一个子标签,取消读取最后两个字符(按顺序为R<),并调用readNode()解析子节点。当我尝试取消读取<时,异常发生了。

在调试器中,我还验证了PushbackReader的私有pos变量确实设置为0,但我无法弄清楚原因。我已经解析了一整行文本——为什么这些字符不再计数呢?

我想发布我的代码,但它非常冗长,而且由于相同的操作之前已经工作,我不确定我的具体实现是否相关。如果是,请指出我可以上传片段的地方,我将分享所有代码。


我认为没有看到一些代码是无法回答这个问题的。请确保您实际上使用了指定正确缓冲区大小的构造函数(默认值为1)。 - Jörn Horstmann
@Jörn:如果我只包含了代码的部分,构造函数可能不在其中,因为我认为它并不相关(我对缓冲区大小一无所知 - 我以为它是整个流......),所以它只会出现在我展示了全部代码的情况下,但我认为这太长了。正如你和Adrian Mouat所建议的那样,问题在于缓冲区大小,可以找到并解决它,而不必看到我的实际代码=) - Tomas Aschan
2个回答

5
默认的PushbackReader缓冲区大小不是只有1吗?这会在您推回第二个字符时引起问题。如果增加缓冲区的大小会发生什么?

2
好的发现!将缓冲区大小增加到2解决了问题!=)对于未来寻找此问题的幸运者:缓冲区大小没有setter,因此必须使用构造函数PushbackReader(Reader in, int size)进行设置。 - Tomas Aschan

0

我得到了这个:

byte[] bytes = programaFonte.getBytes();

PushbackReader reader = new PushbackReader(new InputStreamReader(new ByteArrayInputStream(bytes)),bytes.length);

这样做会默认使用最坏的内存使用情况 - 实际上,您正在表明您可能想要读取整个流,然后将整个流再次推回到读取器中。在我的用例中,我只需要推回2个字符,因此没有必要分配比那更大的缓冲区。我不知道您的用例是什么,但如果您可能需要将整个流推回,则最好一开始就将整个内容读入String,然后使用该字符串进行操作。 - Tomas Aschan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接