Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决关闭文件流失败的问题_Java_Filestream_Resource Leak - Fatal编程技术网

Java 如何解决关闭文件流失败的问题

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 =

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

  • 可能无法关闭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);
}