java 关闭文件_Java8流文件,如何控制文件的关闭?

小编典典

关于使用FileReader的一般注意事项:FileReader在内部使用FileInputStream,它会覆盖finalize()并且因此不建议使用它对垃圾回收的影响,尤其是在处理大量文件时。

除非您使用的是Java 7之前的Java版本,否则应改用java.nio.files API,使用以下命令创建BufferedReader

Path path = Paths.get(filename);

BufferedReader br = Files.newBufferedReader(path);

因此,流管道的开始应看起来更像

filenames.map(Paths::get)

.filter(Files::exists)

.map(p -> {

try {

return Optional.of(Files.newBufferedReader(p));

} catch (IOException e) {

return Optional.empty();

}

})

现在到您的问题:

选项1

保存原件的一种方法Reader是使用元组。通常,元组(或其任何n元变体)是处理函数应用程序的多个结果的好方法,因为它是在流管道中完成的:

class ReaderTuple {

final Reader first;

final T second;

ReaderTuple(Reader r, T s){

first = r;

second = s;

}

}

现在,您可以将FileReader映射到元组,其中第二项是您当前的流项目:

filenames.map(Paths::get)

.filter(Files::exists)

.map(p -> {

try {

return Optional.of(Files.newBufferedReader(p));

} catch (IOException e) {

return Optional.empty();

}

})

.filter(Optional::isPresent)

.map(Optional::get)

.flatMap(r -> new ReaderTuple(r, yourOtherItem))

....

.peek(rt -> {

try {

rt.first.close() //close the reader or use a try-with-resources

} catch(Exception e){}

})

...

这种方法的问题在于,只要在flatMap和peek之间执行流期间发生未经检查的异常,读者就可能不会关闭。

选项2

使用元组的另一种方法是将需要阅读器的代码放在try-with-resources块中。这种方法的优势在于您可以控制所有读者。

范例1:

filenames.map(Paths::get)

.filter(Files::exists)

.map(p -> {

try (Reader r = new BufferedReader(new FileReader(p))){

Stream.of(r)

.... //put here your stream code that uses the stream

} catch (IOException e) {

return Optional.empty();

}

}) //reader is implicitly closed here

.... //terminal operation here

范例2:

filenames.map(Paths::get)

.filter(Files::exists)

.map(p -> {

try {

return Optional.of(Files.newBufferedReader(p));

} catch (IOException e) {

return Optional.empty();

}

})

.filter(Optional::isPresent)

.map(Optional::get)

.flatMap(reader -> {

try(Reader r = reader) {

//read from your reader here and return the items to flatten

} //reader is implicitly closed here

})

示例1的优点是读者肯定会关闭。示例2是安全的,除非您在创建读取器和try-with-resources块之间添加更多内容,否则可能会失败。

我个人将使用示例1,并将访问读者的代码放在单独的函数中,以使代码更易读。

2020-11-19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值