Java 非托管资源开发分享
问题背景
对于非托管资源(文件读写,数据库连接,网络连接)开发的时候都是需要手工调用close接口进行资源的释放.
开发时需要特别注意,异常处理时需要在finally里对资源进行关闭,要不然很容易出现资源泄漏.以下是推荐写法.
try-with-resources
Java 7开始引入了try-with-resources语句,可以在代码块结束时自动关闭资源。以下是2中写法对比,try-with-resources明显要简单.
//try-with-resources写法
try (FileInputStream fis = new FileInputStream("file.txt")) {
// 处理文件
}catch (IOException e) {
// 处理异常
}
//原始写法
FileInputStream fis ;
try {
fis = new FileInputStream("file.txt");
// 处理文件
}catch (IOException e) {
// 处理异常
}finally{
if(fis != null){
fis.close();
}
}
如果需要打开多个资源,可以用;分隔多个资源,在try()中,我们可以实例化任意数量的实现了AutoCloseable接口的对象,代码块执行完毕或者抛出异常后,这些资源会自动被关闭,无需显式调用close()方法。
try (FileInputStream fis = new FileInputStream("file.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr)) {
// 使用BufferedReader读取文件内容
}catch (IOException e) {
// 处理异常
}
AutoCloseable接口
我们有给Spring管理的非托管资源或者我们自己封装了一个非托管资源,这个时候我们的对象需要继承AutoCloseable接口.
AutoCloseable是Java标准库中有一个接口,该接口定义了一种在使用完资源后自动关闭资源的方式。
继承AutoCloseable接口的类需要实现close()方法,在该方法中释放资源。
继承AutoCloseable类如果托管给Spring,Spring会调用close()方法,实现资源的释放.
继承AutoCloseable类直接开发的类也能使用try-with-resources写法.
网友评论