Files.readAllLines()

时间:2016-08-08 12:08:34

标签: java file java-8

我正在迭代一些文件,准确地说是5328。这些文件是平均XML文件,最多60-200行。它们首先通过解析路径的简单方法 isXmlSourceFile 进行过滤。

    Files.walk(Paths.get("/home/me/development/projects/myproject"), FileVisitOption.FOLLOW_LINKS)
            .filter(V3TestsGenerator::isXmlTestSourceFile)
            .filter(V3TestsGenerator::fileContainsXmlTag)

最大的问题是第二个过滤器,尤其是方法fileContainsXmlTag。对于每个文件,我想检测一个模式是否在其中至少包含一次:

private static boolean fileContainsXmlTag(Path path) {
    try {
        return Files.readAllLines(path).stream().anyMatch(line -> PATTERN.matcher(line).find());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

对于某些文件,我得到了这个例外

java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at java.nio.file.Files.readAllLines(Files.java:3205)
at java.nio.file.Files.readAllLines(Files.java:3242)

但是当我使用FileUtiles.readLines()而不是Files.readAllLines时,一切都进展顺利。

这是一个好奇的问题,所以如果有人知道发生了什么,那就很愉快。

由于

1 个答案:

答案 0 :(得分:14)

方法Files.readAllLines()假设您正在阅读的文件以UTF-8编码。

如果您收到此异常,则您正在阅读的文件很可能使用与UTF-8不同的字符编码进行编码。

找出使用的字符编码,并使用另一个允许您指定字符编码的readAllLines方法。

例如,如果文件是用ISO-8859-1编码的:

return Files.readAllLines(path, StandardCharsets.ISO_8859_1).stream()... // etc.

方法FileUtiles.readLines()(它来自哪里?)可能假设其他东西(它可能假定文件是系统的默认字符编码,这不是UTF-8)。