Работа с файлами
В языке Java есть довольно много классов для работы с файлами и прочими потоками ввода/вывода, они расположены в пакете java.io. Коротко рассмотрим некоторые из них.
Класс File
служит для получения информации о файлах и каталогах. Для создания объекта этого класса есть 3 конструктора, чаще всего используется следующий:
File(String имя_файла) | создание объекта 'файл' по его имени в файловой системе |
В этом классе есть много полезных функций, например,
isDirectory() | проверяет, является ли данный объект каталогом, возвращает логическое значение |
isFile() | проверяет, является ли данный объект файлом, возвращает логическое значение |
lastModified() | возвращает дату последней модификации файла |
canRead() | проверяет, можно ли читать данные из файла, возвращает логическое значение |
canWrite() | проверяет, можно ли записывать данные в файл, возвращает логическое значение |
delete() | удаляет файл |
и т.п.
Следующие 7 классов используются для работы с двоичными файлами.
Класс FileInputStream
(производный от InputStream)
простейший класс для потокового (последовательного) чтения данных из файла. Объект этого класса создается на основе объекта File или по имени файла в файловой системе, например,
FileInputStream myfile = new FileInputStream("data.txt");
Для чтения данных используются методы
read() | читает и возвращает один символ из файла |
read(byte [] массив) | читает и возвращает массив символов из файла |
Для закрытия файла есть метод close, определенный в родительском классе InputStream.
Класс FileOutputStream
(производный от OutputStream)
простейший класс для потокового (последовательного) вывода данных в файл. Объект этого класса создается на основе объекта File или по имени файла в файловой системе, например,
FileOutputStream myfile = new FileOutputStream("data.txt");
Для записи данных используются методы
write(int символ) | печатает один символ в файл (обратите внимание, что тип параметра - int!) |
write(byte [] массив) | печатает массив байтов в файл |
Для закрытия файла есть метод close, определенный в родительском классе OutputStream.
Довольно неудобно читать и записывать данные в файл по отдельным байтам. Следующие два класса служат своеобразными "оболочками" для предыдущих классов и позволяют оперировать данными всех стандартных типов.
Класс DataInputStream
(производный от InputStream)
простейший класс для потокового (последовательного) чтения данных стандартных типов из файла. Объект этого класса создается на основе объекта InputStream, т.е., например,
DataInputStream myfile = new DataInputStream(new FileInputStream("data.txt"));
Для всех стандартных типов данных определены методы:
readInt() readFloat() readChar() и т.п. | читает значение указанного типа |
Для чтения не-латинских букв можно порекомендовать функцию readUTF.
Класс DataOutputStream
(производный от OutputStream)
простейший класс для потоковой (последовательной) записи данных стандартных типов в файл. Объект этого класса создается на основе объекта OutputStream, т.е., например,
DataOutputStream myfile = new DataOutputStream(new FileOutputStream("data.txt"));
Для всех стандартных типов данных определены методы:
writeInt(int число) writeFloat(float число) writeChar(char символ) writeChars(String строка) и т.п. | печатает значение указанного типа |
Для печати не-латинских букв можно порекомендовать функцию writeUTF.
Классы BufferedInputStream и BufferedOutputStream
используют буферизованный ввод-вывод, поэтому работают более эффективно, чем, например, FileInputStream и FileOutputStream.
Класс RandomAccessFile
класс для работы с файлами произвольного доступа, используется как для чтения, так и для записи. Объект этого класса cоздается на основе объекта File или по имени файла в файловой системе. Конструкторы:
RandomAccessFile(String имя_файла, String режим) RandomAccessFile(File файл, String режим) | параметр "режим" может принимать значения: "r" - только для чтения и "rw" - для чтения и записи |
Для всех стандартных типов данных определены методы:
readInt() readFloat() readChar() и т.п. | читает значение указанного типа |
writeInt(int число) writeFloat(float число) writeChar(char символ) writeChars(String строка) и т.п. | печатает значение указанного типа |
Для смещения внутреннего указателя в любое место файла используется метод
seek(long смещение) | смещение задается в байтах от начала файла |
Следующие 6 классов используются для работы с текстовыми файлами.
Классы InputStreamReader и OutputStreamWriter
(производные от Reader и Writer)
простейшие классы для чтения/записи из/в текстовый файл. Объекты этих классов создаются на основе объектов InputStream и OutputStream. Например,
InputStreamReader myfile =
new InputStreamReader(new FileInputStream("data.txt"));
OutputStreamWriter myfile =
new OutputStreamWriter(new FileOutputStream("data.txt"));
Оба класса имеют функцию getEncoding для получения текущей кодовой страницы (cp1251 - кодовая страница для русского Windows), а также конструкторы, которые позволяют задать нужную кодовую страницу в качестве второго параметра.
Имеют только методы read и write для чтения/записи символа (строки символов).
Классы FileReader и FileWriter
(производные от InputStreamWriter и OutputStreamWriter)
отличаются от InputStreamWriter и OutputStreamWriter тем, что объекты этих классов cоздаются на основе объекта File или по имени файла в файловой системе, т.е.
FileReader myfile = new FileReader("data.txt");
FileWriter myfile = new FileWriter("data.txt");
а также не имеют конструктора с заданием кодовой страницы.
Классы BufferedReader и BufferedWriter
(производные от Reader и Writer)
используются для буферизованного ввода-вывода данных, поэтому их использование более эффективно, чем, например, FileReader и FileWriter. Создаются на основе объектов Reader и Writer, например,
BufferedReader myfile = new BufferedReader (new FileReader("data.txt"));
BufferedWriter myfile = new BufferedWriter (new FileWriter("data.txt"));
В классе BufferedReader определен метод readLine(), который позволяет читать строку символов.
Классы PipedInputStream и PipedOutputStream
классы для канальных потоков ввода-вывода. Хорошо подходят для обмена информацией между процессами. Более подробно мы рассмотрим их на лекции.
Несколько замечаний по работе с русским текстом.
1. Классы FileWriter и FileReader работают с русскими буквами без проблем:
Запись:
FileWriter myfile = new FileWriter("data.txt");
myfile.write("proba pera --- проба пера");
Чтение:
FileReader myfile = new FileReader("data.txt");
char buf[] =new char[80];
myfile.read(buf);
System.out.println(buf);
2. Классы BufferedWriter и BufferedReader также работают с русскими буквами без проблем:
Запись:
BufferedWriter myfile = new BufferedWriter(new FileWriter("data.txt"));
myfile.write("proba pera --- проба пера");
Чтение:
BufferedReader myfile = new BufferedReader (new FileReader("data.txt"));
System.out.println(myfile.readLine());
3. Функции readUTF и writeUTF классов DataInputStream и DataOutputStream позволяют записывать и читать русские символы в/из файла. При этом получившийся файл будет нечитабельным в текстовых редакторах.
Запись:
DataOutputStream myfile = new DataOutputStream(new FileOutputStream("data.txt"));
myfile.writeUTF("proba pera --- проба пера");
Чтение:
DataInputStream myfile = new DataInputStream(new FileInputStream("data.txt"));
System.out.println(myfile.readUTF());
4. Классы OutputStreamWriter и InputStreamReader позволяют явно указывать кодировку символов, например,
Запись:
OutputStreamWriter myfile = new OutputStreamWriter(new FileOutputStream("data.txt"),"KOI8-R");
System.out.println(myfile.getEncoding());
myfile.write("proba pera --- проба пера");
Чтение:
InputStreamReader myfile = new InputStreamReader(new FileInputStream("data.txt"), "KOI8_R");
System.out.println(myfile.getEncoding());
char buf[] =new char[80];
myfile.read(buf,0,80);
System.out.println(buf);
При этом получившийся файл, разумеется, можно читать в текстовых редакторах.
ПРИМЕРЫ
- Чтение (указанного пользователем) файла, построчное чтение и вывод на консоль его содержимого, перезапись файла
- Дозапись в файл
Предварительно нужно создать текстовый файл с несколькими строчками текста.
Можно использовать символы кириллицы.
- Random Access File (файл с прямым доступом)
После 5-го символа в файле testRAF.txt вставляет символ " * ".