Автоматическое закрытие файла. Оператор try с ресурсами. Примеры
Содержание
- 1. Автоматическое закрытие файла с помощью блока try. Оператор try с ресурсами
- 2. Использование оператора try с ресурсами. Конвертирование содержимого файла в массив строк. Пример
- 3. Оператор try с ресурсами, который содержит несколько файловых объектов. Пример
- Связанные темы
Поиск на других ресурсах:
1. Автоматическое закрытие файла с помощью блока try. Оператор try с ресурсами
Любой файл, который открывается и используется должен быть закрыт с помощью вызова метода close(). Если этого не сделать, то это может привести к вытоку памяти и связанных с этим осложнений.
В версии JDK 7 появилась новая возможность управления потоками ввода вывода в файлы – автоматическое управление ресурсами (ARM – Automatic Resource Management) или автоматическое завершение процесса. Эта возможность основана на усовершенствованной версии оператора try и состоит в предотвращении случаев ошибочного не закрытия файла (не освобождения ресурса).
Общая форма оператора try, который обеспечивает автоматическое управление ресурсами, следующая:
try (resource_specification) { // использование ресурса // ... }
здесь resource_specification – оператор, который объявляет и инициализирует такой ресурс, как поток ввода/вывода в файл. В операторе resource_specification объявляется переменная, которая есть ссылкой на управляемый объект. В случае с файлом, объявляется переменная, которая есть ссылкой на файловый объект.
Вышеприведенный оператор еще называется оператор try с ресурсами.
Возможна другая форма использования оператору try с ресурсами. При такой спецификации оператор try с ресурсами может содержать блоки catch и finally.
try (resource_specification) { // использование ресурса // ... } catch (...) { // обработка ошибок // ... } finally { // блок завершения // ... }
⇑
2. Использование оператора try с ресурсами. Конвертирование содержимого файла в массив строк. Пример
В примере демонстрируется функция GetLinesFromFile(), которая конвертирует содержимое текстового файла в массив строк типа String[]. В функции используется оператор try с ресурсами, в котором в качестве ресурса фигурирует файловый объект с именем fr. В операторе try нету вызова метода fr.close(). Этот метод будет вызван автоматически.
import java.io.*; ... // Получить строки файла в виде массива String[] public static String[] GetLinesFromFile(String filename) throws IOException { // Объявить внутренние переменные String lines[] = null; // массив строк - результат String lines2[] = null; // дополнительный массив строк String s; // дополнительная переменная - строка int symbol; // Оператор try с ресурсами. // Создается файловый объект fr, который связан с файлом "textfile.txt" try (FileReader fr = new FileReader(filename)) { // Начальная инициализация перед входом в цикл lines = new String[0]; // создать массив из 0 строк s = ""; // Цикл чтения символов из файла и создание массива lines[] do { // Считать символ из файла symbol = fr.read(); if ((char)symbol == '\n') { // удалить из s символ '\n' s = s.substring(0,s.length()-1); // добавить в массив строк lines[] строку s lines2 = new String[lines.length+1]; // создать новый массив lines2[] for (int i=0; i<lines.length; i++) lines2[i] = lines[i]; lines2[lines.length] = s; lines = lines2; // Очистить строку s s = ""; } else { s = s + (char)symbol; } } while (fr.ready()); // здесь файл не нужно закрывать, // метод fr.close() будет вызван автоматически } catch (FileNotFoundException e) { System.out.println("File not found."); return null; } catch (IOException e) { System.out.println("I/O error."); return null; } return lines; }
Использование метода GetLinesFromFile() может быть, например, таким
public static void main(String[] args) throws IOException { String lines[]; lines = GetLinesFromFile("textfile.txt"); if (lines!=null) { // Вывести масив lines[] для контроля System.out.println("The content of file \"textfile.txt\""); for (int i=0; i<lines.length; i++) System.out.println(lines[i]); } }
⇑
3. Оператор try с ресурсами, который содержит несколько файловых объектов. Пример
В операторе try может быть создано одновременно несколько файловых объектов (ресурсов). В нижеследующем примере объявляется функция CopyTextFiles(), в которой реализовано копирование текстовых файлов.
В функции реализован оператор try с ресурсами, который управляет двумя ресурсами одновременно. Первый ресурс fr это файловый объект, который есть источником (файл-оригинал). Второй ресурс fw – это файловый объект, который есть приемником или копией.
Текст функции следующий.
import java.io.*; public static void CopyTextFiles(String filename1, String filename2) throws IOException { try (FileReader fr = new FileReader(filename1); FileWriter fw = new FileWriter(filename2)) { int symbol; do { symbol = fr.read(); fw.write(symbol); } while (fr.ready()); // Не нужно вызывать методы fr.close() и fw.close(), // эти методы будут вызваны автоматически } catch (IOException e) { System.out.println("Error: " + e.getMessage()); return; } }
Вызов функции из другого кода может быть, например, таким
public static void main(String[] args) throws IOException { CopyTextFiles("textfile.txt", "textfile3.txt"); }
⇑
Связанные темы
- Исключения. Исключительная ситуация. Ключевые слова try, catch, finally. Примеры
- Операторы throw, throws. Примеры
- Примеры реализации операций, которые модифицируют текстовые файлы. Классы FileReader, FileOutputStream, PrintStream
⇑