【问题标题】:how to peek at a single char in a non-buffered reader in java如何在java中的非缓冲阅读器中查看单个字符
【发布时间】:2013-09-20 03:27:56
【问题描述】:

我正在编写一个程序,它接受一个阅读器并解析来自该阅读器的输入。我不能使用 BufferedReader,但我想实现一个 peek 方法来查看阅读器中的当前字符,而不实际调用该字符上的 read()。有没有比将其转换为字符数组或字符串并查看字符更简单/更好的方法?我很想使用 mark() 方法,但不幸的是,这只适用于缓冲阅读器。

【问题讨论】:

  • 为什么不用BufferedReader?不使用的原因可能会影响可用的解决方案(如果有的话)。
  • PushbackInputStream 呢?
  • 我正在将其写入规范,该规范规定我们不能使用缓冲阅读器。 PushbackInputStream 不也需要使用缓冲阅读器吗?

标签: java buffer peek


【解决方案1】:

自然的解决方案是使用PushBackReader,它提供了可用于实现peekunread 方法。 (你可以算出细节!)

但是否允许这样做并不完全清楚。这取决于您是被禁止使用BufferedReader 还是“缓冲的Reader”。在后一种情况下,PushBackReader 可以说是一个缓冲的Reader

如果您必须在不使用现有的缓冲 Reader 类的情况下实现这一点,那么您应该如何处理这取决于需要多少前瞻:

  • 如果您只需要一个字符前瞻(例如,只需peek),那么您可以使用int 来表示前瞻,并使用boolean 来表示它当前是否有效。

  • 如果需要多个字符前瞻,则需要一个数组(或列表),等等。


为了记录,mark()reset() 方法实际上在 Reader API 中。问题是并非所有Reader 类都能够实现这些方法……由于底层流的限制……在操作系统级别。

【讨论】:

  • 规范有点含糊,并指出不能缓冲阅读器。在这种情况下,我认为推回阅读器可能适用,因为阅读器本身没有缓冲,但包含一个字符的推回缓冲区。它也不支持标记操作,这是明确禁止的。
  • @user1601687 - 解释您的规范实际上是您和编写它的人之间的事情。我猜是你的讲师。但在这种情况下,你可能会更好地考虑他/她打算你做什么。而且我推测他/她打算您自己实现所有窥视/回推代码......作为编程练习。我很确定他们打算让你使用PushBackReader ...如果你使用它,你就有被贬低的风险。
【解决方案2】:

您可以使用基于 java.io.PushBackReader 的 peek 方法编写自己的类。

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2014-02-22
    • 2023-03-28
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多