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>
.
我需要多次提供文件的 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>
.