我需要多次提供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
?
答案 0 :(得分:2)
当然不是 - 您应该在需要时使用Supplier
。这里的问题是Stream
类实现AutoCloseable
,而try-with-resource
在结束后调用它的close
方法。
因此,应该让Supplier
负责通过移动Stream
来关闭try-with-resource
,或者可以将其他内容作为Stream
返回,例如, List<String>
。