Java 如何解决关闭文件流失败的问题
我在try/finally中关闭了文件steam,但代码分析警告我:Java 如何解决关闭文件流失败的问题,java,filestream,resource-leak,Java,Filestream,Resource Leak,我在try/finally中关闭了文件steam,但代码分析警告我: 可能无法关闭FileOutputStream 可能无法关闭PrintWriter 可能无法关闭OutputStreamWriter 失败怎么可能发生?如何确保文件流已关闭 public void writeFile(String filepath) { BufferedWriter bw = null; PrintWriter pw = null; try { File file =
- 可能无法关闭FileOutputStream
- 可能无法关闭PrintWriter
- 可能无法关闭OutputStreamWriter
public void writeFile(String filepath)
{
BufferedWriter bw = null;
PrintWriter pw = null;
try {
File file = new File(filepath);
bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
pw = new PrintWriter(bfw);
//do something
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
bfw.close();
pw.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
如果您使用的是
Java-7
及以上版本,那么您可以使用try with resources
File file = new File(filepath);
try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
PrintWriter pw = new PrintWriter(bfw);)
{
...
}
catch(Exception exception) //This is optional
{
exception.printStackTrace();
}
您可以像普通的try语句一样,在try with resources语句中使用catch和finally块
希望这有帮助 如果在关闭bw时发生异常,您将不会关闭pw。试试这个:
finally{
try{
bw.close();
} catch(Exception e){
e.printStackTrace();
} finally {
pw.close();
}
}
失败怎么可能发生
请参见您的最后一块:
finally{
try{
bfw.close(); <== exception occured here
pw.close(); <== this is not execute
}catch(Exception e){
e.printStackTrace();
}
}
是的,如果您使用Java 7或更高版本,您总是会这样做。事实上,pw.close()在内部关闭底层stream-bw。最好的解决方案(Java7除外)是:pw=newPrintWriter(newBufferedWriter(newOutputStreamWriter)(newFileOutputStream(file),“UTF-8”);您可以完全忽略catch和finally块,因为隐式finally已经存在。我认为Am_I_有用,而VedX是答案。最好在close()之前执行null检查,并捕获close()中发生的每个异常,以防资源泄漏。吠陀是一个很好的答案,有明确的解释,但它不能处理异常情况。所以我选择这个作为答案你知道来自
commons io
的IOUtils
有公开的安全漏洞吗,@tensor?
try {
........
} finally {
IOUtils.closeQuietly(bfw);
IOUtils.closeQuietly(pw);
}