我在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();
}
}
}
答案 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();
}
}