2011-05-24 109 views
2

我正在实现一个语法阅读器作为从作业分配的副产品,我一次只阅读一个XML文件。我的目标是采用我通过实验任务的代码,并改进结构和设计。推回缓冲区溢出 - 但我的缓冲区还未满?

我有一个SyntaxReaderPushbackReader继承,其中有一些额外的方法,如readAndExpect(char c)trimWhitespace()readUntilChar(char c)。然后,我有一个XMLSyntaxReaderSyntaxReader继承,并增加了像readAttribute()readNode()功能(后者是递归树中的孩子们......)。

我已经基本上只是从我的实验室任务所采取的工作代码,并将其粘贴到这种做法合适的地方。但是,当我尝试阅读第一个孩子时,我收到了一个IOException: Pushback buffer overflow,我无法弄清楚。

这是我的XML文件的开头:

<Biosfar namn="Liv">ar allt som fortplantar sig 
    <Rike namn="Vaxter"> etc... 

我已经调试并观看了语法,阅读器处子标签开始成功地读取所有的方式通过<R。在这一点上,XMLSyntaxReader证明了它是一个子标签,unreads最后两个字符(R<,按顺序),并呼吁readNode()解析子节点。当我尝试未读<时发生异常。

在调试器中,我也验证了PushbackReader的私人pos变量确实设置为0,但我想不出为什么。我已经解析了一整行文字 - 为什么这些角色还不算数?

我会发布我的代码,但它是相当漫长的,正如我以前工作过的相同的我不知道我的确切的实现是相关的。如果是这样,请指向某处我可以上传代码片段,然后我将分享所有代码。

+0

我不认为这能不看到一些代码来回答。请确保您确实使用指定正确缓冲区大小的构造函数(默认值为1)。 – 2011-05-24 12:20:45

+0

@乔恩:如果我只包括我的代码部分,构造可能一直没在那里反正,因为我不认为这是相关的(我没有缓冲区大小的想法 - 我认为这是整个流...),所以如果我已经显示了我的*完整*代码,那么它只会在那里,我认为它太过长。正如你和Adrian Mouat所建议的那样,问题出在缓冲区大小上,并且可以在没有看到我的实际代码的情况下找到并解决它=) – 2011-05-24 16:05:59

回答

4

是不是PushbackReader缓冲区只1的默认大小?这会导致这个问题,当你推第二个字符。如果增加缓冲区的大小会发生什么?

+2

好!将缓冲区的大小增加到2解决了问题! =)对于追求幸运的人来说,将来会发现这个问题:缓冲区大小没有setter,因此必须使用构造函数'PushbackReader(Reader in,int size)'来设置它。 – 2011-05-24 16:04:02

0

我与它这样得到:

byte[] bytes = programaFonte.getBytes(); 

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

这样你就可以默认最糟糕的内存使用情况,但是,你实际上是在说你可能想要读取整个流,然后再把整个流再次推送到阅读器上。在我的用例中,我只需要推回2个字符,所以不需要分配比这更大的缓冲区。我不知道你的用例是什么,但是如果你可能需要推回整个流,那么你最好先把整个东西看成一个'String',然后用它来处理。 – 2015-02-12 07:27:44