Попрощайтесь со сложными закрытиями потоков

Java

Введение

Возможно, у вас много проблем при использовании потоков, потому что они не закрыты или закрыты неправильно. На самом деле в java7 появился механизм автоматического закрытия потока, но мы его не использовали.

Во-вторых, пример потока автоматического закрытия

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("我是要成为海贼王的男人");
        }
    }
}

Мы помещаем объект открытого потока прямо в круглые скобки попытки, чтобы, когда поток израсходован, поток автоматически закрывался.Это не только избавляет от проблем, но и позволяет избежать ошибок, которые могут быть вызваны самозакрыванием.

3. Принцип исследования

Это так удивительно? Давайте приоткроем эту загадочную завесу и посмотрим, где здесь «работает» злодей. Через инструмент jd-gui открываем

посмотрите файл класса.

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 помогает нам работать лучше, вы можете обратиться к процессу выключения, который вы написали ранее, если возникнут какие-либо проблемы. Процесс автозакрытия тот же, поток, который сначала закрывается, а затем открывается, потому что если тот, который был открыт первым, закрывается первым, и если тот, который был открыт позже, использует тот, который был открыт первым, это будет сгенерировать исключение.

Почему он автоматически закрывается?

Это связано с тем, что в java7 появился интерфейс AutoCloseable. Почти все, что поставляется с java, использующим потоки, реализует этот интерфейс. Ниже приведена схема наследования.

4. Резюме

Мы можем открыть поток, который реализует интерфейс AutoCloseable в блоке try, используя механизм автоматического закрытия, введенный java7, так что после завершения использования поток будет автоматически правильно закрыт и попрощается с исключением закрытия потока.