输入流写入持久化卷
有一个简单的需求:有一个输入流InputStream,要将其写入持久化卷;写了几版,总是报coverity有内存泄露;写下解决过程
第一版:
private static void writeUserImportFile(InputStream is) throws IOException{
BufferedInputStream in=null;
BufferedOutputStream out=null;
File targetfile = new File(SaRuleConstant.TEMPRULEFILE +File.separator+ USERfILENAME);
in=new BufferedInputStream(is);
out=new BufferedOutputStream(new FileOutputStream(targetfile));
int len=-1;
byte[] b=new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
in.close();
out.close();
}
/***
问题:leaked_resource: Variable “out” going out of scope leaks the resource it refers to
**/
第二版:之前以为上层有try—catch保护,但似乎没有保护到,重新在此函数中显示用try语句保护
private static void writeUserImportFile(InputStream is) throws IOException{
BufferedInputStream in=null;
BufferedOutputStream out=null;
File targetfile = new File(SaRuleConstant.TEMPRULEFILE +File.separator+ USERfILENAME);
in=new BufferedInputStream(is);
out=new BufferedOutputStream(new FileOutputStream(targetfile));
try{
int len=-1;
byte[] b=new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
}finally {
in.close();
out.close();
}
}
/***
finally语句避免了内存泄露
**/
第三版:优化try语句比较臃肿,可以简化;文件可以参数传递,函数更通用
private static void writeUserImportFile(InputStream is, File targetfile) throws IOException{
try (
BufferedInputStream in=new BufferedInputStream(is);
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(targetfile));
){
int len = -1;
byte[] b=new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
}
}
总结:对于IO操作,保护要做到位,可以先采用稳妥的方法实现,后续根据需求优化;