Unreleased Resource: Streams

1、未释放的资源:流

	以下方法从不关闭它打开的文件句柄。FileInputStream的finalize()
方法最终调用close(),但不能保证调用finalize()方法需要多长
时间。在繁忙的环境中,这可能会导致JVM耗尽其所有的文件句柄。
 no1: 
 private void processFile(String fName) throws FileNotFoundException, IOException {
	FileInputStream fis = new FileInputStream(fName);
	int sz;
	byte[] byteArray = new byte[BLOCK_SIZE];
	while ((sz = fis.read(byteArray)) != -1) {
	processBytes(byteArray, sz);
	}
}
no2.
	new InputStreamReader(new FileInputStream(File), "GBK");未定义名称,
	直接new使用,这种也导致未关闭,扫出漏洞。

	永远不要依赖finalize()来回收资源。为了调用对象的finalize()方法,垃圾回
收器必须确定该对象符合垃圾回收的条	件。因为除非JVM内存不足,否则不需要
运行垃圾收集器,所以不能保证以方便的方式调用对象的finalize()方法。当垃
圾收集器最终运行时,它可能会导致在短时间内回收大量资源,从而导致“突发”
性能和较低的总体系统吞吐量。随着系统负载的增加,这种影响变得更加明显。
最后,如果资源回收操作可能挂起(例如,如果它需要通过网络与数据库通信),
则执行finalize()方法的线程将挂起。

2、解决方案

no.1
public void processFile(String fName) throws FileNotFoundException, IOException {
FileInputStream fis;
try {
	fis = new FileInputStream(fName);
	int sz;
	byte[] byteArray = new byte[BLOCK_SIZE];
	while ((sz = fis.read(byteArray)) != -1) {
	processBytes(byteArray, sz);
    }
}
finally {
	if (fis != null) {
		safeClose(fis);
	}
  }
}

public static void safeClose(FileInputStream fis) {
	if (fis != null) {
	try {
		fis.close();
	} catch (IOException e) {
		log(e);
		}
	}
}
no.2
	FileInputStream inputStream = new FileInputStream(File)
	new InputStreamReader(inputStream , "GBK");
	最后在下面关闭inputStream即可。

No.3 如果存在超过1个流需要关闭
需要挨个将每个流用try-catch包住,如果仅用一个包含的话,假设第一个关闭是异常将直接跳出,
不执行第二个,扫描也将视为漏洞未修复
无效修改:
finally{
try{
if(流one != null){
流one.close();
}
if(流two != null){
流two .close();
}
} catch (IOException e){
e.printStackTrace();
}
}
有效修改:
finally{
try{
if(流one != null){
流one.close();
}
} catch (IOException e){
e.printStackTrace();
}
try{
if(流two != null){
流two .close();
}
} catch (IOException e){
e.printStackTrace();
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值