twr java_Java7中的try-with-resources(TWR)特性

java6中的资源管理语法

InputStream is = null;

try {

is = url.openStream();

OutputStream out = new FileOutputStream();

try {

byte[] buf = new byte[4096];

int len;

while ((len = is.read(buf)) > 0) {

out.write(buf, 0, len);

}

} catch (IOException e) {

} finally {

try {

out.close();

} catch (IOException closeOutx){

}

}

} catch (FileNotFoundException fnfx) {

} catch (IOException openx){

} finally {

try {

if (is != null) is.close();

} catch (IOException closeInx){

}

}

让我们看看上面的代码用Java7写出来什么样。和上面一样,url是一个指向下载目标文件的URL对象,file是一个保存下载数据的File对象。

try(OutputStream out = new FileOutputStream(file);

InputStream is = url.openStream() ) {

byte[] buf = new byte[4096];

int len;

while((len = is.read(buf)) > 0) {

out.write(buf, 0, len);

}

}

这是资源自动化管理代码块的基本形式——把资源放在try的圆括号内,在这段代码块中使用的资源在处理完成后会自动关闭。

但使用try-with-resources特性时还是要小心,因为在某些情况下资源可能无法关闭。比如在下面的代码中,如果从文件(sonmeFile.bin)创建ObjectInputStream时出错,FileInputStream就可能无法正确关闭。

try(ObjectInputStream in = new ObjectInputStream(new

FileInputStream("someFile.bin")) ) {

...

}

假定文件(someFIle.bin)存在,但可能不是ObjectInput类型的文件,所以文件无法正确打开。因此不能构建ObjectInputStream,所以FileInputStream也没办法关闭。

要确保twr生效,正确的用法是为各个资源声明独立变量。

try(FIleINputStream fin = new FileInputStream("someFIle.bin");

ObjectInputStream in = new ObjectInputStream(fin) ) {

...

}

目前TWR特性依靠一个新定义的接口实现AutoCloseable。TWR的try从句中出现的资源类都必须实现这个接口。Java7平台中的大多数资源类都被修改过,已经实现了AutoCloseable(Java7还定义了其父接口Closeable),但并不是全部资源相关的类都采用了这项技术。不过JDBC4.1已经具备了这个特性。

然而在自己的代码里,在处理资源时一定要用TWR,从而避免在异常处理时出现bug。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值