Java. Автоматическое закрытие файла. Оператор try с ресурсами. Примеры

Автоматическое закрытие файла. Оператор 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");
}

 


Связанные темы