我在 try/finally 中关闭了文件 Steam,但代码分析警告我:



失败怎么会发生?如何确保 FileStream 已关闭?

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

最佳答案



查看您的 finally 块:

finally{
    try{
        bfw.close();   <== exception occured here
        pw.close();    <== this is not execute
    }catch(Exception e){
        e.printStackTrace();
    }
}

如果 bfw.close() 发生异常怎么办? pw.close() 永远不会执行。这会导致资源泄漏。



有人已经指出在 finally 里面使用 try/catch/finally 。
但是如果你不喜欢看到这么多 try catch 最后,我建议你使用像 Apache Commons IO 这样的库。

解决方案:
try {

   ........
} finally {
    IOUtils.closeQuietly(bfw);
    IOUtils.closeQuietly(pw);
}

是的,如果使用 Java 7 或更高版本,您总是有 try-with-resources

关于java - 如何解决关闭 FileStream 失败的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49547389/

10-13 03:34