【问题标题】:Behavior of using \Z vs \z as Scanner delimiter使用 \Z 与 \z 作为扫描仪分隔符的行为
【发布时间】:2014-03-12 11:25:58
【问题描述】:

[编辑] 我找到了答案,但由于对新用户的限制,我无法回答这个问题。无论哪种方式,这都是 Java 中的一个已知错误。

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8028387

我正在尝试在 64 位 ubuntu 上将文件读入 Java 6 中的字符串。 Java 给我一个非常奇怪的结果,"\\Z" 它读取整个文件,但"\\z" 它读取整个字符串最多 1024 个字符。我已经阅读了所有类的 Java 6 API,但我不知所措。

\Z 和 \z 的说明见:

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#lt

什么可能导致这种奇怪的行为?

String fileString = new Scanner(new File(fileName)).useDelimiter("\\z").next();
String fileString2 = new Scanner(new File(fileName)).useDelimiter("\\Z").next();
System.out.println("using Z : " + fileString2.length());
System.out.println("Using z "+ fileString.length());

输出: 使用 Z : 9720 使用 z : 1024

谢谢!

有关文件/java-version 的详细信息:

使用 java-6-openjdk-amd64 运行 Ubuntu(也使用 oracle java6 进行了测试) 文件是 UTF-8 编码的简单文本文件。

【问题讨论】:

  • 我已经为你完成了 :-)
  • 好的。由于您撤消了我的编辑...您可以改进您的问题如下:1)删除“谢谢”。表达感谢的最佳方式是支持相关答案并接受最好的答案。 2) 删除 "First time poster ..." 的东西。这不是您的主要问题的一部分,我们可以判断您是否是第一次发帖。如果您特别希望人们对您的问题发表评论,请在评论中询问 cmets。
  • 如果你向我们展示了输入文件的样子,你也可以帮助人们回答......因为人们在复制它时遇到了问题。请注意,您接受的答案只是一个理论。我怀疑它是否是真正的解释,因为如果是,那将是一个简单的 Java 错误,而简单的 Java 错误在野外很少见。 (人们往往比这更早找到它们。)
  • 嗯……我的意思是 / 是标准 Java 类库中的一个简单错误。
  • 谢谢斯蒂芬 - 我会重做你的编辑。我没有注意到这是对您的编辑,只是以为我以某种方式弄乱了我的问题的提交。我的输入是带有 UTF-8 编码的简单文本文件。该错误出现在所有文件中。例如,一个仅由 a 组成的文件(没有新行/空格等)。我会更多地查看文件并更新我的问题。谢谢。

标签: java character-encoding eof


【解决方案1】:

正如Pattern 文档所述

  • \z输入结束
  • \Z 输入的结尾,但对于最后的终止符,如果有的话

我怀疑由于扫描仪缓冲区大小设置为1024

354 private static final int BUFFER_SIZE = 1024; // 改为 1024;

Scanner 会读取这么多字符并将其用作当前输入,因此这里可以使用\z 来表示它的结束,而\Z 则不能,因为它不是“final terminator”(在整个输入读取)。

【讨论】:

  • 这很有意义。我想我没有正确解析句子“Z The end of the input but for the final terminator, if any”。我需要用谷歌搜索“最终终结者”是什么。谢谢!!
  • @Pshemo ...这是一个合理的解释。但是,我不明白如何根据规范所说的来证明这种行为是合理的。缓冲应该是透明的。
  • @StephenC 这就是为什么我说这只是我的怀疑。我也在尝试更详细地弄清楚它,但到目前为止没有任何运气:/
  • 是的,现在我正在使用带有 multiline 标志的一些组合的 Pattern/Matcher 类,不同长度的字符串,在第 1024 个字符之前和之后放置 \r \n 但无法重现这种行为。现在我不能做更多,但稍后会尝试更深入地了解 Scanner 类如何使用分隔符。
  • @StephenC 那么这是我们遇到的 Java 中的错误吗:) bugs.java.com/bugdatabase/view_bug.do?bug_id=8028387
猜你喜欢
  • 2011-01-23
  • 2020-02-25
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多