Как правило, поток ввода-вывода следует закрыть, когда он больше не нужен. Если не сделать этого, может произойти утечка памяти и истощение ресурсов.
В версии JDK 7 появились два основных способа, которыми можно закрыть поток ввода-вывода. Первый способ подразумевает явный вызов метода close() для потока ввода-вывода. Это традиционный подход, который применялся с первого выпуска Jаvа. При таком подходе метод close() обычно вызывается в блоке оператора finally. Ниже приведен упрощенный шаблон традиционного способа закрытия потока ввода-вывода.
Эта общая методика ( или ее разновидность) широко применялась в коде, написанном до появления версии JDК 7.
1 2 3 4 5 6 7 |
try { // открыть файл и получить доступ к нему } catch(исключение_ввода-вывода) { // ... } finally { // закрыть файл } |
Второй способ закрытия потока ввода-вывода подразумевает автоматизацию данного процесса с по мощью оператора try с ресурсами, который был внедрен в версии JDK 7 (и, разумеется, поддерживается в версии JDK 8). Оператор try с ресурсами является усовершенствованной формой оператора try, имеющей следующий вид:
1 2 3 |
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. Напишите в комментарии(указав ссылку) какое кресло купили бы вы себе.