Два способа закрытия потока ввода-вывода Java

Два способа закрытия потока ввода-вывода JavaКак правило, поток ввода-вывода следует закрыть, когда он больше не нужен. Если не сделать этого, может произойти утечка памяти и истощение ресурсов.

В версии JDK 7 появились два основных способа, которыми можно закрыть поток ввода-вывода. Первый способ подразумевает явный вызов метода close() для потока ввода-вывода. Это традиционный подход, который применялся с пер­вого выпуска Jаvа. При таком подходе метод close() обычно вызывается в блоке оператора finally. Ниже приведен упрощенный шаблон традиционного способа закрытия потока ввода-вывода.

Эта общая методика ( или ее разновидность) широ­ко применялась в коде, написанном до  появления версии JDК 7.

Второй способ закрытия потока ввода-вывода подразумевает автоматизацию данного процесса с по мощью оператора try с ресурсами, который был внедрен в версии JDK 7 (и, разумеется, поддерживается в версии JDK 8). Оператор try с ресурсами является усовершенствованной формой оператора try, имеющей сле­дующий вид:

где параметр спецификация_ресурса обозначает один или несколько операторов , в которых объявляется и инициализируется ресурс, например, файл или другой ресурс, связанный с потоком ввода-вывода. В указанной спецификации_ресурса обычно объявляется переменная, которая инициализируется ссылкой на управляемый объект.

По завершении блока оператора try ресурс освобождается автоматически. Для файла это означает его автоматическое закрытие. Следовательно, отпадает необходимость вызывать метод close() явным образом.

Ниже перечислены три главные особенности применения оператора try с ре­сурсами:

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

Не следует также забывать, что область действия объявляемого ресурса огра­ничивается оператором try с ресурсами. Главное преимущество оператора try с ресурсами заключается в том, что ресурс (в данном случае поток ввода-вывода) закрывается автоматически по завершении блока оператора try.

Таким образом, исключается даже возможность забыть закрыть поток ввода-вывода по небрежно­сти. Кроме того, способ закрытия потока ввода вывода с помощью оператора try с ресурсами, как правило, приводит к более краткому и понятному исходному коду, который проще сопровождать.

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

Вполне возможно, что вам при­дется иметь дело с унаследованным кодом, в котором применяется этот традици­онный подход, или же в среде, где используется одна из прежних версий Java. Не исключено также, что автоматизированный способ окажется непригодным из-за других особенностей прикладного кода. Поэтому в некоторых примерах организа­ции ввода-вывода на нашем сайте демонстрируется традиционный способ закрытия потока ввода-вывода, чтобы показать, каким образом он применяется на практике.

И последнее замечание: примеры, в которых применяется оператор try с ресурсами, следует компилировать современной версией компилятора jаvа. Их нельзя скомпилировать прежним компилятором, выпущенным до версии Java SE 7. А примеры, в которых применяется традиционный способ закрытия потока вво­да-вывода, могут быть откомпилированы прежними версиями компиляторов Java.

Запомните! Оператор try с ресурсам и упрощает процесс освобождения ресурсов, исключая даже возможность забыть освободить используемый ресурс по небрежности. Поэтому такой спо­соб освобождения ресурсов рекомендуется применять при всякой возможности в процессе разработки нового кода.

Как всегда, в конце статьи вопрос для читателей. Недавно приобрел себе удобное кресло с онлайн магазина http://www.osvito.com. Напишите в комментарии(указав ссылку) какое кресло купили бы вы себе.