
- •Лабораторная работа № 3 Обработка файлов
- •Введение
- •Класс InputStream
- •Класс OutputStream
- •Файловый ввод/вывод
- •Буферизованные потоки
- •Класс File
- •Класс RandomAccessFile
- •Пример подсчета количества определенного слова в файле
- •Пример объекта "Книга" с методами чтения и записи в файл
- •Работа с конфигурационными файлами
- •Пример класса preloader для загрузки конфигурационного файла
- •Контрольные вопросы
- •Задание
- •Приложение 1. Работа с датой и временем в Java
- •Приложение 2. Класс StreamTokenizer
Класс RandomAccessFile
Класс RandomAccessFile предоставляет более совершенный механизм для работы с файлами, чем файловые потоки. Он не является расширением Input Stream или OutputStream, поскольку может осуществлять любую из операций чтения/записи или оба действия сразу. Режим работы с файлом указывается в качестве параметра для различных конструкторов. Класс Random AccessFile реализует оба интерфейса Data InputStream и DataOutput Stream, поэтому он может применяться для чтения/записи встроенных типов Java.
Хотя класс RandomAccessFile не является расширением входных и выходных потоковых классов, имена и сигнатуры содержащихся в нем методов совпадают с вызовами read и write. Хотя это означает, что вам не придется учить новый набор имен и семантик для выполнения той же самой задачи, объекты класса RandomAccessFile не могут использоваться там, где требуется присутствие объектов InputStream или OutputStream. Тем не менее, вы можете использовать объекты RandomAccessFile вместо объектов-потоков DataInput или DataOutput.
Класс RandomAccessFile содержит три конструктора:
public RandomAccessFile(String name, String mode)
Создает объект RandomAccessFile для заданных имени файла и режима. Режим указывается в виде “r” или “rw” для доступа по чтению или чтению/записи соответственно. Любое другое значение режима приводит к возбуждению IOException.
public RandomAccessFile(File file, String mode)
Создает объект RandomAccessFile для заданного объекта класса File и режима.
public RandomAccessFile(FileDescriptor fd)
Создает объект RandomAccessFile для заданного объекта fd типа File Descriptor (см. раздел “Файловые потоки и FileDescriptor”).
Термин “произвольный доступ” (random access), вынесенный в название типа, обозначает возможность установки файлового указателя чтения/записи в любую позицию внутри файла с последующим выполнением нужной операции. Эта возможность обеспечивается следующими методами:
public long getFilePointer()
Возвращает текущее смещение (в байтах) от начала файла.
public void seek(long pos)
Устанавливает файловый указатель в заданную позицию (в байтах). Следующий считанный или записанный байт будет иметь смещение pos.
public long length() throws IOException
Возвращает длину файла.
InputStreamReader и OutputStreamWriter
Пакет java.io предоставляет классы, которые позволяют выполнять конвертацию между символьными потоками Unicode и байтовыми потоками не-Unicode текста. При помощи класса InputStreamReader существует возможность преобразовывать байтовые потоки в символьные потоки. Для перевода символьных потоков в байтовые потоки используется класс OutputStreamWriter.
При создании объектов InputStreamReader и OutputStreamWriter, задается байтовая кодировка, в которую необходимо выполнить преобразование. Например, чтобы перевести текстовый файл в кодировке UTF-8 в Unicode, необходимо сделать следующее:
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
Если не указать идентификатор кодировки, InputStreamReader и OutputStreamWriter будут обращаться к кодировке по умолчанию. Вы можете определить кодировку, используемую InputStreamReader или OutputStreamWriter, вызвав метод getEncoding, таким образом:
InputStreamReader defaultReader = new InputStreamReader(fis);
String defaultEncoding = defaultReader.getEncoding();