Java Scanner hasNextLine方法返回false。

6

我有几个文件(实际上它们也是保存在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");??为什么要添加新行?看起来你又添加了一个“新行”。还有一个空行吗??? - bobs_007
请明确一下,这个字符是一个句号吗?另外,你是如何检索文件的? - Sam Berry
3
那是一个ASCII扩展字符(锐音符号:U+00B8),不应该有问题;你应该检查(用十六进制编辑器)前面的字节是什么;无论如何,Scanner scanner = new Scanner(file, "UTF-8") - guido
@ᴳᵁᴵᴰᴼ:也许如果你将其作为ASCII读取,在空字符处会出错? - Willem Van Onsem
我没有得到那个结果(我将 Cedilla 复制到文本文件中并使用了类似于您的代码,hasNextLine 返回 true)。我想知道文件格式是否存在分歧?即文件是 UTF-8 但您告诉 Java 它是不同的,或者反过来)。 - ajb
显示剩余5条评论
1个回答

5

这很可能是一个字符集问题,由于运行Java代码的平台默认使用不同的字符集; 启动解析时指定期望/需要使用的字符集总是一个良好的实践方法,对于Scanner类而言,只需调用构造函数

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

第二个参数是字符集文字,或者更好的选择:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接