我正在遍历一些文件,准确地说是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;
}

对于某些文件,我得到了这个异常(exception)
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时,一切都会好起来。

这是一个好奇心问题,因此,如果有人作为正在发生的事情的线索,那是很高兴的。

谢谢

最佳答案

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

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

找出使用了什么字符编码,并使用其他 readAllLines 方法,该方法允许您指定字符编码。

例如,如果文件以ISO-8859-1编码:

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

方法FileUtiles.readLines()(这是从哪里来的?)可能假定了其他内容(它可能假定文件使用系统的默认字符编码,而不是UTF-8)。

07-25 22:26