Files.lines()
返回Stream<String>
,据我所知,除非我对其应用终端操作,否则不会对其进行评估。那么,为什么它会声明IOException
。在初始化Stream
期间可能出现什么问题会证明异常声明的合理性?
我的用例是以下方法。我想创建一个流,使用目录中所有文件的搜索模式流式传输所有文本行。
现在,如果Files.lines()
在流评估期间遇到以意外编码格式化的文件,则会因运行时异常而失败。 catch块不会捕获此异常。那么,为什么我需要进行异常处理呢?
public static Stream<String> grep(Path dir, Pattern pattern) throws IOException {
return Files.walk(dir)
.filter(p -> !Files.isDirectory(p) && p.getFileName().toString().endsWith(".log"))
.map(p -> {
try {
return Files.lines(p);
} catch(Exception e) {
return Stream.<String>empty();
}
}).flatMap(s -> s)
.filter(l -> pattern.matcher(l).find());
}
答案 0 :(得分:0)
虽然在应用终端操作之前不会评估返回的流,但在Files.lines中创建流本身会创建一个新的Files.newBufferedReader,它可能抛出给定的异常。
我们可以在第3744行看到这一点 - source。
public static Stream<String> lines(Path path, Charset cs) throws IOException {
BufferedReader br = Files.newBufferedReader(path, cs); // this could throw IOException
try {
return br.lines().onClose(asUncheckedRunnable(br));
} catch (Error|RuntimeException e) {
try {
br.close();
} catch (IOException ex) {
try {
e.addSuppressed(ex);
} catch (Throwable ignore) {}
}
throw e;
}
}