我想向您道歉一个模糊的问题。
我正在借助使用Java构建解析器一书来构建小型解析器的标记化部分。它使用PushbackReader和其中包含的String作为一种方法,首先检测给定字符串的第一个字符,然后将PushbackReader发送到适当的状态(然后,该状态将标记构建为包含String的单独对象)。
PushbackReader似乎仅在流中未找到其他使用字符的情况下使用。然后,它不读取最后一个字符。
使用CharBuffer的追加是否可以做同样的事情?最好是不需要预先定义缓冲区的内容。
最佳答案
根据我的了解,他选择PushbackReader的原因有两个:
他需要一个能够处理单个字符的阅读器。
他需要在流中进行备份,因为在进行标记时,他需要提前看一个或多个字符来确定当前字符是否是标记的一部分。
例如,使用方法WhitespaceState.nextToken,他正在跳过空格字符。他拉出一个角色,看着它。如果是空白字符,则他提取下一个字符。当他最终拉出一个非空格字符时,将其放回流中,因此查看流的下一个方法将是查看正确的字符。
虽然您可以用只有两个方法read()和unread()的更简单的方法替换它,但是您必须记住,这样做可能会
读取整个输入,然后处理输入。因此,如果您有一个大文件,您将耗尽内存来存储它。
将输入作为流读取一次,但存储来自unread()的字符并将它们以单独的结构传递。
使用PushbackReader,他只需通过输入读取和处理一次,就不必缓冲整个输入,也不必存储unread()字符并分别传递它们。