如何解决无法关闭 FileStream

How to solve failure to close a FileStream

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

  • Possible failure to close a FileOutputStream
  • Possible failure to close a PrintWriter
  • Possible failure to close an OutputStreamWriter

怎么会失败呢?如何确保 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();
        }
    }
}

如果您使用的是 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();
    }
}

How can failure happen?

查看你的 finally 块:

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

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

How can I ensure the FileStream is closed?

终于有人指出在里面用try/catch/finally了。 但是如果你不想看到这么多 try catch finally 我建议你使用像 Apache Commons IO.

这样的库

解决方案:

try {

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

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