33 Java. Потоки ввода-вывода. Работа с файлами. Белорусский государственный экономический университет кафедра экономической информатики
Скачать 1.6 Mb.
|
Закрытие потоковПри завершении работы с потоком его надо закрыть с помощью метода close(), который определен в интерфейсе Closeable. Метод close() имеет следующей контракт: void close() throws IOException Интерфейс Closeable реализуется в классах InputStream и OutputStream, а через них и во всех классах потоков. При закрытии потока освобождаются все выделенные для него ресурсы, например, файл. Есть два способа закрытия файла. Первый традиционный заключается в использовании блока try…catch…finally. Пример. Результат работы программы: Поскольку при открытии или считывании файла может произойти ошибка ввода-вывода, то код считывания помещается в блок try. И чтобы быть уверенным, что поток в любом случае закроется, даже если при работе с ним возникнет ошибка, вызов метода close() помещается в блок finally. Так как метод close() также в случае ошибки может генерировать исключение IOException, то его вызов также помещается во вложенный блок try…catch. Начиная с Java 7 можно использовать еще один способ, который автоматически вызывает метод close(). Этот способ заключается в использовании конструкции try-with-resources (try-с-ресурсами). Данная конструкция работает с объектами, которые реализуют интерфейс AutoCloseable. Так как все классы потоков реализуют интерфейс Closeable, который в свою очередь наследуется от AutoCloseable, то их также можно использовать в данной конструкции Перепишем предыдущий пример с использованием конструкции try-with-resources. Пример. Результат работы программы совпадает с предыдущим. Формат конструкции try-with-resources, следующий: try(ИмяКласса имяОбъекта = КонструкторКласса( Отличительной особенностью является использование круглых скобок у ключевого слова try. В круглых скобках может быть перечислено через точку с запятой несколько операторов, открывающих разные потоки. Подобная конструкция использовалась, в одном из примеров ранее. Пример. try(FileInputStream fin = new FileInputStream("notes.txt"); FileOutputStream fos = new FileOutputStream("notes_new.txt")) { //блок try } Данная конструкция также не исключает использования блоков catch. После окончания работы в блоке try у указанного в круглых скобках ресурса или перечисленных ресурсов (в данном случае у объекта FileInputStream) автоматически вызывается метод close(). Замечание. Кроме того в настоящее время возможно автоматическоезакрытиепотоковввода/выводабезявноговызоваметода close(). |