Scanner会不时返回NoSuchElementException

时间:2015-04-18 11:13:59

标签: java

根据一些博文和论坛条目(例如http://www.java-tips.org/java-se-tips/java.util/scanning-text-with-java.util.scanner-3.html),可以使用带有\ Z作为分隔符的Scanner来读取整个文件。 Normaly,这对我来说只有这个代码:

log.debug("CSV-File: {} {}", csvFile.exists(), csvFile);
try (Scanner scanner = new Scanner(csvFile)) {
    String fileContent = scanner.useDelimiter("\\Z").next();
    log.debug("FileContent: {}", fileContent);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

但有些文件(据我所知,全部用UTF-8编写)无法以这种方式读取,因为抛出了这样的异常:

java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    ...

对于舒尔,我可以测试,天气有这样的元素,如NoSuchElementException in Scanner中所建议的那样。但是如果没有&Z,那么该程序就不会读取任何内容,这不是我的目标;我的目标是使用尽可能少的代码将整个文件读入一个字符串。

我发现一个条目说这不能读取整个文件:http://closingbraces.net/2011/12/17/scanner-with-z-regex/但没有条目说\ Z不能出现在文件中。有谁知道为什么会这样,天气有变通方法?

可以选择使用Files.readAllBytes,并从中构造一个String,但是因此需要知道charset,我不知道。

1 个答案:

答案 0 :(得分:1)

在使用scanner.next()之前,尝试使用hasNext api测试您是否有要读取下一个字符串标记的内容:

if (scanner.hasNext()) {
   ... = scanner.next();
   ... 
}