Главная » Java, Web » Файлы

0

Программы могут читать данные из существующего файла либо создавать новые файлы. В Java это происходит с использованием потоков. Данные, предназначенные для чтения человеком, читаются из файла с использованием объектов, принадлежащих классу FiieReader, который является подклассом класса Reader. Данные, которые следует записать в файл и которые имеют формат, предназначенный для чтения человеком, записываются с использованием объектов класса Fiiewriter, который является подклассом класса writer. Для данных, не предназначенных для чтения человеком, используются классы Filelnputstream и FileOutputStream. В ЭТОЙ части мы коснемся только ввода и вывода данных, содержащих символы, то есть данных, предназначенных для чтения человеком. Необходимо иметь в виду, что классы Filelnputstream и FileOutputStream ИСПОЛЬЗуЮТСЯ точно таким же способом, что и классы FiieReader и FiieWriter. Все эти классы определяются в пакете java.io.

В предыдущей главе мы имели дело с апплетами. Апплеты не могут работать с файлами. Таковы требования безопасности. Апплет может быть получен прямо в браузер без участия пользователя, причем программа апплета передается по интернету. Если бы полученный апплет мог иметь доступ к файловой системе пользовательского компьютера, то можно было бы с легкостью создать такой апплет, который мог бы уничтожить все данные, расположенные на компьютере пользователя. Чтобы предотвратить подобные неприятности, предусмотрен ряд мер, обеспечивающих безопасность. Среди них есть запрет на доступ к локальным файлам. Самостоятельные Java-программы могут обращаться к файлам в полном объеме. При создании таких программ мы имеем возможность работать с файлами так, как пожелаем, в том числе выполнять все те действия, о которых рассказано в настоящей главе.

Класс FiieReader располагает конструктором, который в качестве своего параметра требует указания потока ввода. Конструктор создает поток ввода по имени, указанном в качестве параметра. Этот поток затем может использоваться для чтения данных. Если файл отсутствует, то возникает исключение FileNotFoundException. Этот тип исключений требует обязательной обработки возникающих исключений, поэтому вызов конструктора следует производить внутри инструкции try либо внутри функции, которая работает с этим исключением (throw FileNotFoundException). Например, если у нас есть файл, который назван data.txt, и мы хотим создать программу, которая будет читать данные из этого файла, то можно поступить следующим образом:

FiieReader data; // Объявляем переменную до блока try.

// Переменная внутри блока не будет доступна извне.

try {

data = new FileReaderCdata.txt"); // создаем поток

}

catch (FileNotFoundException е) { … // обработка ошибок

}

Класс ошибки FileNotFoundException — ЭТО IIO.lK.iacc класса IOException. После того как поток будет удачно создан (с использованием FiieReader), можно приступить к чтению данных из этого потока. Класс FiieReader содержит только простейшие методы чтения, которые он наследует из класса

Reader, поэтому наш объект типа FileReader удобно обработать при помощи других классов, например, при помощи класса TextReader. (Класс TextReader не является стандартным классом в Java, его описание приведено выше.) Для создания объекта TextReader, который будет производить чтение данных из файла data.dat, можно написать набор следующих инструкций:

TextReader data; try {

data = new TextReader(new FileReaderCdata.dat"));

}

catch (FileNotFoundException e) { … // обработка ошибок

}

После того как создан объект TextReader с именем data, можно переходить к использованию методов, которые позволяют осуществлять чтение:

data.getInt(), data.getWord() .

Работы с записью в файлы — несколько более сложная задача. Мы создаем объект класса FileWriter. Созданный поток можно использовать для работы с объектом класса PrintWriter. Предположим, мы хотим записать данные в файл result.dat. Конструктор FileWriter чувствителен к ошибкам типа iOException, поэтому используем блок try: PrintWriter result; try {

result = new PrintWriter(new FileWriterCresult.dat"));

}

catch (IOException e) { … // обработка ошибок

}

Если файл с именем result.dat не существует, то будет создан новый файл. Если файл с указанным именем уже существует, то содержимое этого файла будет стерто и заменено данными, которые будут получены от программы. При работе может возникнуть исключение iOException, если, например, будет произведена попытка записать на защищенный от записи диск.

После того как работа с файлом завершена, файл следует закрыть. Это сообщит операционной системе о том, что мы прекратили использование файла. Если мы забудем это сделать, то, как правило, файл будет автоматически закрыт после завершения выполнения программы или после того, как объект потока для данного файла будет удален в процессе сбора мусора. Однако лучше специально позаботиться и закрыть файл в явном виде. Закрыть файл можно с применением метода close () для указанного потока.

После того как файл был закрыт, чтение данных из него становится невозможным до тех пор, пока мы вновь не откроем его, создав новый поток. Для большинства классов потоков метод closet) может приводить к появлению исключения ioException. Это исключение необходимо обработать, но в Printwriter и TextReader этот метод переопределен и не вызывает указанного исключения.

В качестве примера приведем полную программу, которая читает числа из файла, названного data.dat, после чего программа записывает прочитанные числа в противоположном порядке в файл result.dat. Предполагается, что файл data.dat содержит лишь по одному числу в каждой строке и количество чисел в файле не превышает 1000. Для проверки возникающих ошибок используются соответствующие инструкции. Это приложение не слишком практично, но в нем демонстрируются основные методы работы с вводом и выводом данных, хранящихся в файлах.

Листинг 2.2. Пример программы ввода-вывода

import java.io.*;

public class ReverseFile {

public static void maintString[] args) {

TextReader data;     // поток ввода символов

PrintWriter result; // поток вывода символов

double[] number = new double[1000]; // массив для хранения всех

// прочитанных из файла чисел int numberCt; // количество чисел, хранимых в массиве // создание потока ввода try {

data = new TextReadertnew FileReaderCdata.dat"));

catch (FileNotFoundException e) {

System.out.printlnt"Can’t find file data.dat!"); return;

// создание потока вывода try {

result = new PrintWritertnew FileWriter("result.dat"));

catch tlOException e) {

System.out.printlnt"Can’t open file result.dat!"); System.out.println(e.toString());

data.close (); 11 закрытие файла ввода return;

}

// чтение данных из файла try {

numberCt = 0;

while (data.eof() == false) { // читать до конца файла

number[numberCt] = data.getlnDouble();

numberCt++;

}

// вывод чисел в обратном порядке for (int i = numberCt-1; i >= 0; i—) result.printIn(number[i]); System.out.printIn("Done!");

}

catch (TextReader.Error e) {

// ошибки при чтении данных из файла

System.out.printIn("Input Error: " + e.getMessage());

}

catch (IndexOutOfBoundsException e) { // слишком много данных в файле

System.out.printIn("Too many numbers in data file."); System.out.printIn("Processing has been aborted.");

}

finally {

// завершение работы программы и закрытие файла data.close(); result.close();

}

} }

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии