我正在迭代一些文件,准确地说是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时,一切都进展顺利。
这是一个好奇的问题,所以如果有人知道发生了什么,那就很愉快。
由于
答案 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)。