Supplier 应该用来提供文件流吗?

Should Supplier be used to supply File Stream?

我需要多次提供文件的 Stream 以便在不同时间对其执行不同的操作,我使用了以下供应商:

Supplier<Stream<String>> linesSupplier = () -> {
    try
    {
        return Files.lines(Paths.get(file.toURI()));
    }
    catch (IOException e)
    {
        log.error("Error while supplying file " + file.getName(), e);
    }
    return null;
};

不幸的是,它导致 file handle leak,所以我尝试按照建议使用 try-with-resource。

Supplier<Stream<String>> linesSupplier = () -> {
    try(Stream<String> lines = Files.lines(Paths.get(file.toURI())))
    {
        return lines;
    }
    catch (IOException e)
    {
        log.error("Error while supplying file " + file.getName(), e);
    }
    return null;
};

但现在我第一次使用 linesSupplier.get(),我得到一个 java.lang.IllegalStateException

这是否表明我应该尝试主动避免 Supplier,无论在什么情况下?

当然不是——您应该在需要时使用 Supplier。这里的问题是 Stream class 实现了 AutoCloseable 而你的 try-with-resource 在它结束后调用它的 close 方法。

因此,应该让 Supplier 负责通过移动 try-with-resource 来关闭 Stream,或者可以 return 其他东西作为 Stream,例如 List<String>.