以下方法从不关闭它打开的文件句柄。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()方法的线程将挂起。
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();
}
}