guava中Closer的用法

在JDK7以前,对文件操作,我们需要时刻注意用完后关闭文件。

InputStream in = null;

try {

  in = openInputStream();

  OutputStream out = null;

  try {

    out = openOutputStream();

    // do something with in and out

  } finally {

    if (out != null) {

      out.close();

    }

  }

} finally {

  if (in != null) {

    in.close();

  }

}

可以看到,这段代码真是太复杂了,一不小心就出错了。

可喜的是JDK7有了新的措施来解决这类问题,那就是try-with-resources 语句,如:

try (

        java.util.zip.ZipFile zf =

             new java.util.zip.ZipFile(zipFileName);

        java.io.BufferedWriter writer = 

            java.nio.file.Files.newBufferedWriter(outputFilePath, charset)

    ) {

        // Enumerate each entry

        for (java.util.Enumeration entries =

                                zf.entries(); entries.hasMoreElements();) {

            // Get the entry name and write it to the output file

            String newLine = System.getProperty("line.separator");

            String zipEntryName =

                 ((java.util.zip.ZipEntry)entries.nextElement()).getName() +

                 newLine;

            writer.write(zipEntryName, 0, zipEntryName.length());

        }

    }

基本语法是:try(…) {} ,try里面所有实现接口java.lang.AutoCloseable,包括java.io.Closeable的对象,在{}的语句块执行完毕后都会自动的close。

 

那JDK7以前的版本怎么办呢,guava给我们提供了方法。我们可以把Closeable 的对象注册到Closer对象上,资源使用完毕后,调用closer的close方法,就可以把所有注册了的资源安全的close掉。这个方法虽然没有try-with-resources好用,但是比起传统的jdk做法,要好很多了。

Closer closer = Closer.create();

try {

  InputStream in = closer.register(openInputStream());

  OutputStream out = closer.register(openOutputStream());

  // do stuff with in and out

} catch (Throwable e) { // must catch Throwable

  throw closer.rethrow(e);

} finally {

  closer.close();

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值