如何解决无法关闭 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。
我在 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。