我正在迭代一些文件,准确地说是5328.这些文件是平均XML文件,最多60-200行.它们首先通过解析路径的简单方法isXmlSourceFile进行过滤.
Files.walk(Paths.get("/home/me/development/projects/myproject"), FileVisitOption.FOLLOW_LINKS)
.filter(V3TestsGenerator::isXmlTestSourceFile)
.filter(V3TestsGenerator::fileContainsXmlTag)
Run Code Online (Sandbox Code Playgroud)
最大的问题是第二个过滤器,尤其是方法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;
}
Run Code Online (Sandbox Code Playgroud)
对于某些文件,我得到了这个例外
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)
Run Code Online (Sandbox Code Playgroud)
但是当我使用FileUtiles.readLines()而不是Files.readAllLines时,一切都进展顺利.
这是一个好奇的问题,所以如果有人作为发生了什么的线索,那就很愉快.
谢谢
Jes*_*per 14
该方法Files.readAllLines()
假定您正在读取的文件以UTF-8编码.
如果您收到此异常,则您正在阅读的文件很可能使用与UTF-8不同的字符编码进行编码.
找出使用的字符编码,并使用另readAllLines
一种方法,允许您指定字符编码.
例如,如果文件是用ISO-8859-1编码的:
return Files.readAllLines(path, StandardCharsets.ISO_8859_1).stream()... // etc.
Run Code Online (Sandbox Code Playgroud)
该方法FileUtiles.readLines()
(来自哪里?)可能假设其他东西(它可能假定文件是系统的默认字符编码,这是UTF-8以外的东西).