本人在探究静态代码扫描中资源对象关闭规则遇到了一些疑惑,本文将这些疑惑记录下来并逐一找出解答。
包括在哪些情况下,这些资源对象需要手动关闭,怎么正确的关闭,哪些情况下不需要手动关闭,以及为什么。
资源对象包括很多种,本文重点关注输入输出流对象和数据库连接对象。
一、正确的关闭资源对象的写法
- 第一种写法:
public static void main(String[] args) throws Exception{
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream=null;
DataOutputStream out=null;
byte[] data1 = "1这个例子测试文件写".getBytes("GB2312");
try {
fileOutputStream = new FileOutputStream("E:\\A.txt");
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
out = new DataOutputStream(bufferedOutputStream);
out.write(data1);
} catch (Exception e) {
// TODO: handle exception
} finally {
if (out!=null) {
out.close();
}
}
}
在finally 中进行关闭可以保证在程序运行出现异常的情况下,资源对象仍然会被正常关闭。
- 第二种写法:
public static void main(String[] args) throws Exception{
byte[] data1 = "这个例子测试文件写".getBytes("GB2312");
try (
FileOutputStream fileOutputStream = new FileOutputStream("E:\\A.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
DataOutputStream out = new DataOutputStream(bufferedOutputStream)
)
{
out.write(data1);
} catch (Exception e) {
// TODO: handle exception
}
}
从Java1.7开始,支持了try-with-resources写法,即将资源对象声明的过程放在try()的括号里面,这样java在资源对象使用完成之后会自动关闭。详情请见官方文档。
- 第三种写法:
import org.apache.commons.io.IOUtils;
public static void main(String[] args) throws Exception{