告別複雜的流關閉

1、引言

也許你們在使用流時由於未關閉、或者未正常關閉引起了不少問題。其實java7引入了自動關閉流機制,只是咱們未使用而已。java

2、自動關閉流例子

public class AutoCloseTest {
    public static void main(String[] args) throws IOException {
        //將打開流代碼放到try中
        try (
                BufferedReader br = new BufferedReader(
                        new FileReader("teacher.txt"));
                PrintStream pr = new PrintStream(new FileOutputStream("a.txt"))
        ) {
            //使用兩個資源
            System.out.println(br.readLine());
            pr.println("我是要成爲海賊王的男人");
        }
    }
}
複製代碼

咱們直接將打開的流對象放到try的圓括號中,這樣當流使用完畢時,會自動將流進行關閉。這樣不只省事並且避免了自行關閉可能帶來的錯誤。app

3、探究原理

這麼神奇嗎?讓咱們來掀開這層神祕面紗,看看是何方妖孽在此「做祟」。經過jd-gui工具,咱們打開jvm

class文件看看。工具

public class AutoCloseTest
{
  public static void main(String[] args)
    throws IOException
  
{
    BufferedReader br = new BufferedReader(new FileReader("teacher.txt"));Throwable localThrowable6 = null;
    try
    {
      PrintStream pr = new PrintStream(new FileOutputStream("a.txt"));Throwable localThrowable7 = null;
      try
      {
        System.out.println(br.readLine());
        pr.println("我是要成爲海賊王的男人");
      }
      catch (Throwable localThrowable1)
      {
        localThrowable7 = localThrowable1;throw localThrowable1;
      }
      finally {}
    }
    catch (Throwable localThrowable4)
    {
      localThrowable6 = localThrowable4;throw localThrowable4;
    }
    finally
    {
      if (br != null) {
        if (localThrowable6 != null) {
          try
          {
            br.close();
          }
          catch (Throwable localThrowable5)
          {
            localThrowable6.addSuppressed(localThrowable5);
          }
        } else {
          br.close();
        }
      }
    }
  }
}
複製代碼

厲害了,jvm幫咱們作的更好,你們能夠參考下以前本身寫的關閉流程有沒有問題。自動關閉流程也是同樣的,先關閉後打開的流,由於若是先關閉先打開的,若是後打開的在使用先打開的,這就會引起異常。ui

爲何會自動關閉呢?

這是由於java7引入了一個AutoCloseable接口。幾乎java自帶的全部使用到流的都實現了這個接口。下面是繼承圖。spa

4、總結

咱們能夠經過使用java7引入的自動關閉機制,將實現了AutoCloseable接口的流放到try塊裏打開,這樣在使用完畢以後,流會自動正確關閉,今後告別流關閉異常。code

相關文章
相關標籤/搜索