java 管道流 需不需要 关闭_java – 在管道中间关闭流

这里有两个问题:处理检查的异常,如IOException,及时关闭资源.

没有一个预定义的函数接口声明任何检查的异常,这意味着它们必须在lambda中处理,或者被包装在一个未经检查的异常并被重新抛出.看起来你的runtimizeException函数是这样做的.你可能还需要为它声明自己的功能界面.你可能发现,这是一个痛苦.

在关闭资源(如文件)时,有一些调查显示,当流到达时,流被自动关闭.这将是方便的,但它不会处理关闭时抛出异常.在流中没有任何魔法的权利机制.

我们留下了处理资源关闭的标准Java技术,即在Java 7中引入的try-with-resources结构.TWR真的希望在打开调用堆栈时将资源关闭在调用堆栈的同一级别.适用“无论谁打开它必须关闭”的原则. TWR还处理异常处理,这通常可以方便地处理异常处理和资源关闭在同一个地方.

在这个例子中,流有点不寻常,因为它映射了一个Stream< Path>到流>.这些嵌套流是未关闭的流,导致系统用完开放文件描述符时的最终异常.这是什么困难的是文件是通过一个流操作打开,然后通过下游;这使得不可能使用TWR.

构建此管道的另一种方法如下.

Files.lines调用是打开该文件的调用,因此这必须是TWR语句中的资源.该文件的处理是(某些)IOExceptions被抛出,所以我们可以在相同的TWR语句中进行异常包装.这表明有一个简单的功能,将路径映射到行数,同时处理资源关闭和异常包装:

long lineCount(Path path) {

try (Stream s = Files.lines(path, StandardCharsets.ISO_8859_1)) {

return s.count();

} catch (IOException ioe) {

throw new UncheckedIOException(ioe);

}

}

一旦你有这个助手功能,主管线如下所示:

Files.find(Paths.get("JAVA_DOCS_DIR/docs/api/"),

100, (path, attr) -> path.toString().endsWith(".html"))

.mapToLong(this::lineCount)

.forEachOrdered(System.out::println);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值