Главная » Java » RandomAccessFile в Java

0

 

   Класс RandomAccessFile реализует более изощренные механизмы работы с файлами, нежели те, которые поддерживаются потоками File. Файл с произвольным доступом к данным (random access file) ведет себя подобно обширному массиву байтов, хранящихся в файловой системе. Этот воображаемый массив снабжен своего рода курсором, или индексом, который называют указателем позиции в файле (file pointer). При вводе данных отсчет байтов производится от текущей позиции указателя, и по завершении операции указатель устанавливается на позицию, следующую за последним из введенных байтов. Если объектом RandomAccessFile поддерживается режим чтения/записи, становятся доступными и операции вывода данных; байты выводятся в файл, начиная с текущей позиции указателя, и по завершении операции указатель устанавливается на позицию, следующую за последним из выведенных байтов.

   Класс RandomAccessFile не является производным от"какого-либо из классов InputStream, OutputStream, Reader или Writer, поскольку одновременно поддерживает функции ввода и вывода и способен обрабатывать как байтовые, так и символьные данные. Конструкторам класса передается специальный аргумент, определяющий, должен ли поток работать в режиме чтения или чтения/записи.

   В составе класса RandomAccessFile объявлены методы readw. write с теми же сигнатурами, что и в классах байтовых потоков; например, read служит для ввода одного байта и возвращает этот байт. Помимо того, класс RandomAccessFile реализует интерфейсы Datalnput и DataOutput (см. раздел 15.5.1), и поэтому его объекты могут быть использованы для чтения и записи данных простых типов, поддерживаемых этими интерфейсами. С помощью средств класса RandomAccessFile вполне возможно осуществить те же операции, для выполнения которых традиционно применяются потоки других типов, и при этом вовсе не нужно заново изучать синтаксис и семантику базовых методов — хотя обращаться к RandomAccessFile в тех ситуациях, где достаточно функционального потенциала иных потоковых классов, вообще говоря, не следует.

Ниже приведено описание конструкторов класса RandomAccessFile.

 

public RandomAccessFile(string name,  String mode)

   throws  FileNotFoundException

Создает файловый поток с произвольным доступом для чтения из файла (и, возможно, записи в файл) с именем name. Допустимыми значениями параметра mode, задающего режим работы потока, служат константы   “ r” (от read — чтение) и " rw" (от read/write — чтение/запись). При передаче в  качестве  аргумента mode  любого другого  значения  выбрасывается исключение  типа  illegalArgumentException.   Если  указанный  файл  не существует, реакция системы зависит от значения mode: в режиме    rw предпринимается попытка создания файла; в противном случае выбрасывается исключение типа FileNotFoundException.

 

public RandomAccessFile(File file,   string mode)

    throws  FileNotFoundException

Создает файловый поток с произвольным доступом для чтения из файла (и, возможно, записи в файл), который определен посредством аргумента file типа File. В остальном конструктор аналогичен предыдущему.

    Поскольку при обращении к файлу  проверяется  наличие  соответствующих полномочий,   рассмотренные  конструкторы  способны  выбрасывать  исключение типа SecurityException, если права на обращение к файлу отсутствуют (см. раздел 18.5).

  Характеристика "random access" (произвольный доступ), присутствующая в названии класса,  свидетельствует о том,  что любой операции ввода-вывода может предшествовать принудительное перемещение указателя на произвольную позицию в файле. Подобные функции поддерживаются с помощью методов, описанных ниже.

 

 public long getFilePointer()throws IOException

Возвращает значение текущей позиции указателя в файле, выраженное в байтах и отсчитываемое от начала файла.

 public void seek(long pos) throws IOException

Перемещает указатель на позицию, определяемую заданным числом pos байтов, считая от начала файла. Очередная операция ввода-вывода осуществит чтение или запись байтов, начиная с позиции pos (первому байту в файле соответствует значение позиции указателя, равное нулю). Перемещение указателя за границу, определяемую текущим положением признака конца файла, приведет к увеличению размера файла, если следующей будет выполнена операция вывода.

 public int skipBytesCint count)  throws IOException

Предпринимает попытку пропустить count байтов; пропущенные байты позже могут быть считаны после соответствующего изменения позиции указателя с помощью вызова метода seek. Возвращает количество фактически пропущенных байтов. Метод никогда не выбрасывает исключения EOFException. Если значение count отрицательно, операция не выполняется.

 public long length() throws IOException

               Возвращает длину файла, выраженную в байтах.

 public void setl_ength(long newLength)  throws IOException

Устанавливает новое значение длины файла, равное newLength. Если файл обладал меньшей длиной, она будет увеличена за счет записи в файл дополнительных байтов (выбор байтового значения, подходящего для этой цели, определяется конкретной реализацией). Если же прежняя длина файла была большей, содержимое файла усекается с отбрасыванием завершающей порции байтов. Если newLength меньше текущего значения позиции указателя в файле (возвращаемого вызовом getFi lePoi nter), указатель перемещается на позицию newLength.

  Чтобы получить объект FileDescriptor, отвечающий открытому потоку RandomAccessFile, необходимо вызвать метод getFD последнего.

 

 

 

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

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