1

一个有点模糊的问题,我提前道歉。

我正在借助 Building Parsers with Java 一书构建小型解析器的标记化部分。它使用 PushbackReader 和其中包含的字符串作为首先检测给定字符串的第一个字符的方法,然后将 PushbackReader 发送到适当的状态(然后该状态将令牌构建为包含字符串的单独对象)。

PushbackReader 似乎仅在流中未找到其他使用字符时才使用。然后它会取消读取最后一个字符。

是否可以用 CharBuffer 的追加来做同样的事情?最好是不需要预定义缓冲区的东西。

4

1 回答 1

1

根据我所见,他选择 PushbackReader 有两个原因:

  1. 他需要一个可以处理单个字符的阅读器。
  2. 他需要在流中进行备份,因为在进行标记时,他需要提前查看一个或多个字符来确定当前字符是否是标记的一部分。

例如,使用 WhitespaceState.nextToken 方法,他正在跳过空白字符。他拉下一个角色并看着它。如果它是一个空白字符,他会拉下一个字符。当他最终拉出一个不是空格的字符时,他将其放回流中,因此查看流的下一个方法将查看正确的字符。

虽然你可以用只有两个方法 read() 和 unread() 的更简单的方法来替换它,但你必须记住,这样做你可能会

  1. 读入整个输入,然后处理输入。因此,如果您有一个大文件,您将占用内存来存储它。
  2. 将输入作为流读取一次,但将来自 unread() 的字符存储并在单独的结构中传递它们。

使用 PushbackReader,他通过输入读取和处理一次,他不必缓冲整个输入,也不必存储 unread() 字符并单独传递它们

于 2012-04-21T16:48:03.890 回答