Вы все еще пишете try-catch-finally? Давайте изящно закроем потоки с помощью try-with-resources

Java

предисловие

В процессе разработки нам часто приходится закрывать некоторые ресурсы в конце. Такие как чтение и запись файловых потоков и т. д., это обычное дело, мы закроем ресурсы в финале, наконец. Но такой способ написания не очень лаконичен. На самом деле, уже в JDK1.7 для закрытия ресурсов была введена функция try-with-resources Давайте испытаем простоту try-with-resources сегодня.

исходное заявление

Эта статья была впервые опубликована под номером заголовка [Happyjava]. Адрес Happy’s Nuggets:Талант /user/398428…, личный блог Хэппи :(blog.happyjava.cn)[blog.happyjava.cn]. Перепечатки приветствуются, но это заявление должно быть сохранено.

Некоторые примеры устаревших ресурсов завершения работы

В старом способе написания (на самом деле, многие программисты до сих пор пишут так) ресурсы закрываются в блоки finally следующим образом:

@Test
public void test4() {
    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream("D:\\head.jpg");
        // do something
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Проблема с таким способом написания заключается в том, что нам нужно закрыть ресурс в блоке finally, поэтому inputStream можно определить только вне блока try. Перед закрытием необходимо выполнить шаг нулевой оценки, чтобы избежать исключения нулевого указателя, вызванного пустым входным потоком. Такой способ написания громоздкий.

try-with-resources

Эта же функция, если вы используете try-with-resources, сделает код очень лаконичным:

@Test
public void test5() {
    try (InputStream inputStream = new FileInputStream("D:\\head.jpg")) {
        byte[] bytes = inputStream.readAllBytes();
        // do something
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Использование try-with-resources заключается в том, чтобы следовать ключевому слову try в круглых скобках и определять ресурсы, которые необходимо закрыть в круглых скобках. После выполнения блока try ресурс автоматически освобождается.

Какие ресурсы могут быть автоматически закрыты с помощью try-with-resources

Не все ресурсы могут быть автоматически закрыты с помощью try-with-resources, автоматически могут быть закрыты только классы, реализующие интерфейс java.lang.AutoCloseable. Если класс, который не реализует java.lang.AutoCloseable, определен в скобках try, компилятор сообщит об ошибке.

Например, если вы настроите класс MyResource и определите его в круглых скобках, будет сообщено об ошибке: требуется класс java.lang.AutoCloseable.

Пользовательские классы, которые могут быть автоматически закрыты

Мы также можем написать наши собственные классы как классы, которые могут быть автоматически закрыты с помощью try-with-resources, если мы реализуем интерфейс java.lang.AutoCloseable.

class MyResource implements java.lang.AutoCloseable {

    @Override
    public void close() {
        System.out.println("调用了close方法");
    }
}
@Test
public void test5() {
    try (InputStream inputStream = new FileInputStream("D:\\head.jpg");
         MyResource myResource = new MyResource()) {
        byte[] bytes = inputStream.readAllBytes();
        // do something
    } catch (IOException e) {
        e.printStackTrace();
    }
}

После выполнения он выведет «метод закрытия был вызван»

Суммировать

try-with-resources может сделать код более кратким и менее подверженным ошибкам. По сравнению с традиционным методом записи try-catch-finally, очевидно, что try-with-resources имеет больше преимуществ, по крайней мере, не будет проблемы с окончательным закрытием ресурса и созданием нулевого указателя, потому что он не оценивается быть пустым.