当前位置: 首页 > 工具软件 > Streams > 使用案例 >

Unreleased Resource: Streams

贾建茗
2023-12-01

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();
}
}

 类似资料:

相关阅读

相关文章

相关问答