【问题标题】:PushbackReader EquivalentsPushbackReader 等价物
【发布时间】:2012-04-20 21:34:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你看过这里的示例代码吗? oozinoz.xp123.com/bpwj.htm
  • 是的。那是我最初得到它的地方。虽然我怀疑我正在尝试做的事情本质上是愚蠢的。
  • 我没有意识到它是 Java 的一部分。请参阅:docs.oracle.com/javase/1.5.0/docs/api/java/io/…。为什么要尝试重新创建 Java 中已经存在的东西?
  • 拥有更一般的东西,例如,没有固定的长度。读者本身似乎是矫枉过正。我所做的只是用 StringBuffer 替换它(在我的版本中)。我有点好奇他们为什么一开始就决定使用 PushbackReader,但也许我会遇到一个地方,它会在以后输入好坏方面有所不同。

标签: java parsing io nio


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2023-03-05
    • 2015-08-10
    • 2015-03-06
    • 2018-09-24
    • 2012-03-17
    相关资源
    最近更新 更多