使用try-with-resources优雅的关闭流

使用try-with-resources优雅的关闭流

java7之前关闭流的方式

在java7之前关闭流,是一件非常麻烦的事情,要写很多异常处理,我们来看看代码


public void readFirstLineFromFile(String path) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(path));
            System.out.println(br.readLine());
        } catch (Exception e){
            // deal with exception
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                // deal with
            }
        }
    }

我们看到因为异常处理导致代码的可读性变差。那能不能是代码变的优雅呢?
在java7之前,只能封装一下代码,隐藏流关闭的细节,实质上还是增加了复杂度。

java7使用try-with-resources优雅关闭流

java7提供了try-with-resources语法糖,让我们可以优雅的处理流的关闭,闲话少叙,直接看代码

public void readFirstLineFromFile(String path) {
        try (BufferedReader br = new BufferedReader(new FileReader(path))){
            System.out.println(br.readLine());
        } catch (Exception e){
            // deal with exception
        }
    }

语法:

 try (打开资源) {
 
 } catch (Exception e) {
     // 处理异常
 }

注意在try()中的对象必须实现接口java.io.Closeable

我们来看看BufferedReader的类图

使用try-with-resources优雅的关闭流_第1张图片

原理

我们反编译一下代码,看下语法糖帮我们做了什么。
可以看到编译后的代码,本质还是处理流的关闭和关闭时的异常,try-with-resources帮助我们优雅的实现了流的关闭处理。


public void readFirstLineFromFile(String path)
  {
    try
    {
      BufferedReader br = new BufferedReader(new FileReader(path));Throwable localThrowable3 = null;
      try
      {
        System.out.println(br.readLine());
      }
      catch (Throwable localThrowable1)
      {
        localThrowable3 = localThrowable1;throw localThrowable1;
      }
      finally
      {
        if (br != null) {
          if (localThrowable3 != null) {
            try
            {
              br.close();
            }
            catch (Throwable localThrowable2)
            {
              localThrowable3.addSuppressed(localThrowable2);
            }
          } else {
            br.close();
          }
        }
      }
    }
    catch (Exception localException) {}
  }

参考

https://docs.oracle.com/javase/8/docs/technotes/guides/language/try-with-resources.html

你可能感兴趣的:(后端,java)