很久没写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行有如下代码: