【发布时间】:2015-05-07 13:47:21
【问题描述】:
我正在创建多个必须并行(或可能并行)访问的流。我知道在编译时资源量是固定的情况下如何进行try-with-resources,但是如果资源量是由参数决定的呢?
我有这样的事情:
private static void foo(String path, String... files) throws IOException {
@SuppressWarnings("unchecked")
Stream<String>[] streams = new Stream[files.length];
try {
for (int i = 0; i < files.length; i++) {
final String file = files[i];
streams[i] = Files.lines(Paths.get(path, file))
.onClose(() -> System.out.println("Closed " + file));
}
// do something with streams
Stream.of(streams)
.parallel()
.flatMap(x -> x)
.distinct()
.sorted()
.limit(10)
.forEach(System.out::println);
}
finally {
for (Stream<String> s : streams) {
if (s != null) {
s.close();
}
}
}
}
【问题讨论】:
-
您是否在询问是否有可以处理您的情况的试用资源?答案是否定的,但你所拥有的一切都很好。
-
另一种方法是将流的开放移动到并行操作中,每个操作只需要处理一个流。
-
是的,尽管有一个问题:理论上
close()可以(尽管在实践中不太可能)抛出一个UncheckedIOException,所以你应该将s.close()包裹在try { s.close(); } catch (Exception ex) { //quash or log }中。 -
当心!
sorted()/distinct()和forEach(而不是forEachOrdered)的组合是问题的根源。见stackoverflow.com/q/28259636/2711488
标签: java java-8 java-stream try-with-resources