Java Streams Files.lines()抛出IOException。为什么呢?

时间:2017-12-07 16:09:11

标签: java exception-handling functional-programming stream

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());
}

1 个答案:

答案 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;
    }
}