hadoop之IOUtils是否需要关闭流?

很久没写blog,有很多值得写的地方。慢慢补。

Hadoop中有个常用的方法org.apache.hadoop.io.IOUtils.copyBytes(InputStream in, OutputStream out, int buffSize),用于将本地文件上传至hdfs。

入参数in和out用完后是否需要关闭呢?显而易见的是流用完后需要关闭,但是经验告诉我,每次写mapreduce,我从未关闭过,也未曾出过问题。

本以为是方法中替我关闭了它,直到我遇见了一个意外。


我在一段程序中调用copyBytes(),之后流依旧未关闭。我测试的时候使用Main()去调用程序,每次程序都能正常结束。

而我将程序入口改为一个Web端的点击。用于启动这个方法的时候,程序却永远无法输出到目标位置上。很是奇怪。

Web端的点击和Main()的区别在哪里?

Main()方法结束后,程序会自动释放,难道释放后程序才关闭了流?显然Web程序是个永不结束的长程序,不满足这个条件。

我最先想到的finalize(),我们知道这个方法不靠谱。但是我去检索hadoop源码,发现有些地方会重写这个方法,多少还都和流有点关系。

但是我在IOUtils中并没有找到finalize()方法,其它类的finalize()调用了流的关闭?依旧没有检索到,很头疼。


就在我快要穷尽所能之时,一个念头闪了过来,钩子!(应该是无意中看到了某处源码)

在org.apache.hadoop.fs.FileSystem中2442行有如下代码:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值