JAVA IO 流的关闭顺序!

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 { }
是个空的没有任何动作

  • 纯金键盘回复 dtph007 : 这个类的close()方法本来就是空的,JDK上也说是它是不可关闭的。

2. 我懂楼主的意思了,一层一层的关实际上和关闭最里层或者只关闭最外层的一样。因为装饰类的close()方法调用的是最底层被包装的类的close()方法。
      纯金键盘回复2:对。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值