关闭流的正确方式

最近写了一个bug:(以下为网上找的例子)

	try {
	        FileOutputStream fos = new FileOutputStream("d:\\a.txt");
	        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
	        BufferedWriter bw = new BufferedWriter(osw);
	        bw.write("java IO close test");
	
	        // 从外到内顺序关闭ok
	        if (bw != null) {
	           bw.close();
	        }
	        if (osw!= null) {
	            osw.close();
	        } if (fos!= null) {
	            fos.close();
	        }
		}catch (Exception e){
	    }
  

看似流已经关闭了,也try了有什么问题呢?
现在有一种情况
当我们关第一个流时出了异常然后catch捕获异常,但是我们总共需要关闭三个流后面的两个流并没有及时关闭就可能会出现内存溢出的情况,所以我确实是把测试环境的服务给撑挂了,也得亏还没有上线。
正确写法

finally {
	try{
		if(osw!= null){
		  osw.close();
		}
		}catch(Exception e){
		}
		
		try{
		if(fos!= null){
		  fos.close();
		}
		}catch(Exception e){
		}
}

每一次关闭流我们都单独进行一次try,而且需要写在finally中保证异常了也要执行,不要嫌弃代码繁琐因为这是必须的内容。
可能一个这样不起眼的小问题就会撑爆一套服务,然后各个服务又是互相调用,这下好了一个小小的细节公司的一套业务线都挂了,然后一群人开始排查问题,最后就是因为流关闭没有处理好,所以细节不可小视

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值