【问题标题】:Java Scanner hasNextLine returns falseJava 扫描器 hasNextLine 返回 false
【发布时间】:2015-06-01 00:19:03
【问题描述】:

我有几个文件(实际上它们也是保存在 Ubuntu 上的 Eclipse 中的 java 源文件),我需要逐行读取和处理。我注意到我无法读取其中一个文件。我使用的代码如下

try (Scanner scanner = new Scanner(file)) {
    while (scanner.hasNextLine() ) {
        builder.append(scanner.nextLine()).append("\n");
    }
} catch (FileNotFoundException ex) {
    System.out.println("Error");
}

我事先检查了文件是否存在。它确实如此。我什至可以重命名它。但我不能读一行。 hasNextLine 只返回 false。 (我什至尝试 hasNext)。

最后我查看了文件的内容,发现有一个不同的字符(在 java 文件的注释部分)。就是下面这个字符。

¸

当我删除这个字符时,我可以正常读取文件。然而,这是不可接受的。即使包含该字符,我该怎么做才能读取文件?

【问题讨论】:

  • 你想在这里做什么? builder.append(scanner.nextLine()).append("\n");??添加换行符为什么?看起来您正在添加另一个“换行符”。一个空行???
  • 要明确这个字符是句号吗?还有你是如何检索文件的。
  • 这是一个ASCII扩展字符(cedilla:U+00B8),应该没有问题;您应该(使用十六进制编辑器)检查前一个字节是什么;无论如何Scanner scanner = new Scanner(file, "UTF-8")
  • @ᴳᵁᴵᴰᴼ:也许如果您将其读取为 ascii,它会在 NULL 字符上出错?
  • 我没有得到那个结果(我将 cedilla 复制到一个文本文件中并使用了与您所拥有的类似的代码,并且 hasNextLine 返回了 true)。我想知道文件格式之间是否存在分歧? IE。该文件是 UTF-8,但您告诉 Java 它是不同的,反之亦然)。

标签: java java.util.scanner


【解决方案1】:

这很可能是字符集问题,这是由于您运行 java 代码的平台默认使用不同的字符集引起的; 总是在解析时指定要使用的预期/需要的字符集是一个好习惯,并且使用 Scanner 类只需将constructor 调用为:

Scanner scanner = new Scanner(file, "UTF-8");

其中第二个参数是字符集文字,甚至是better

Scanner scanner = new Scanner(file, StandardCharsets.UTF_8);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-30
    • 2016-12-20
    • 1970-01-01
    • 2016-01-20
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多