如何解决关闭FileStream失败的问题

时间:2018-03-29 03:09:29

标签: java filestream resource-leak

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

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

3 个答案:

答案 0 :(得分:3)

如果您使用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-with-resources语句一样使用catch和finally块,就像普通的try语句一样。

希望这有帮助!

答案 1 :(得分:2)

  

如何发生失败?

查看你的finally块:

bfw.close()

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

  

如何确保FileStream已关闭?

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

解决方案:

List<string> words = new List<string> { "Blood", "Girl"};
var AuthorList = MyAuthorList.Where(x => x.Address.Contains("Germany") && x.Books.Any(a => words.Any(w=> a.Contains(w)))).ToList();

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

答案 2 :(得分:0)

如果在关闭bw时发生异常,则不会关闭pw。试试这个:

finally{
    try{
        bw.close();
    } catch(Exception e){
        e.printStackTrace();
    } finally {
        pw.close();
    }
}