供应商应该用于提供文件流吗?

时间:2017-11-15 09:51:06

标签: java java-stream try-with-resources

我需要多次提供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

1 个答案:

答案 0 :(得分:2)

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

因此,应该让Supplier负责通过移动Stream来关闭try-with-resource,或者可以将其他内容作为Stream返回,例如, List<String>