java中的各种流由于使用了装饰器实现,所以,有时候关闭需要调用好几个流的close()方法。
以前从老员工那里形成的习惯是,从后面的往前关,先关装饰器的,最后关最早的流。
上几天有个帖子里又说要反过来顺序关闭,有说关最里面一个,有说关最外面一个,公说公有理,今天我就来小小测试一下。
范围:局限在jdk官方提供的流,至于你自己实现的流有什么行为只有你知道。
测试结论
结论1: 关闭最外面层(装饰器)的那个就好了,它会嵌套关闭所有流。
有人肯定要说:那我以前3个都关也没过报异常啊!!
结论2: 重复关闭一个流不会报错。虽然close方法有抛IOException功能,但不会因close()被调用一万遍而抛出。
由内向外关可以吗?
结论3: 可以,内层流关闭了,外层不会自动关闭,但只要不读/写,不会报错,可以关闭。
评论:
1.dtph007 :
InputStream in = new InputStream();
ByteArrayInputStream bis = new ByteArrayInputStream(in);
意思是只bis.close()就好?InputStream会自动关闭?
我刚看了ByteArrayInputStream的源码,
public void close() throws IOException { }
是个空的没有任何动作
ByteArrayInputStream bis = new ByteArrayInputStream(in);
意思是只bis.close()就好?InputStream会自动关闭?
我刚看了ByteArrayInputStream的源码,
public void close() throws IOException { }
是个空的没有任何动作
-
纯金键盘: 回复 dtph007 : 这个类的close()方法本来就是空的,JDK上也说是它是不可关闭的。
2. 我懂楼主的意思了,一层一层的关实际上和关闭最里层或者只关闭最外层的一样。因为装饰类的close()方法调用的是最底层被包装的类的close()方法。
纯金键盘:
回复2:对。