Назад
Вперед
7.17. Произвольный доступ к файлу
Пример демонстрирует использование класса
RandomAccessFile для организации прямого доступа к
записям, хранящимся в файле.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Библиотека классов Java содержит класс RandomAccessFile,
который предназначен для организации прямого
доступа к файлам. Он позволяет выполнять
операции чтения и записи.
В классе RandomAccessFile определено два конструктора,
прототипы которых показаны ниже:
public RandomAccessFile(
String name, String mode);
public RandomAccessFile(
File file, String mode);
Первый из них позволяет указывать имя файла name,
и режим mode, в котором открывается файл. Второй
конструктор вместо имени предполагает
использование объекта класса File.
Если файл открывается только для чтения, вы
должны передать конструктору текстовую строку
режима "r". Если же файл открывается и для
чтения, и для записи, конструктору передается
строка "rw".
Позиционирование внутри файла обеспечивается
методом seek, в качестве параметра pos которому
передается абсолютное смещение файла:
public void seek(long pos);
После вызова этого метода текущая позиция в
файле устанавливается в соответствии со
значением параметра pos.
В любой момент времени вы можете определить
текущую позицию внутри файла, вызвав метод
getFilePointer:
public long getFilePointer();
С помощью метода close вы должны закрыть файл,
после того как работа с ним завершена:
public void close();
С помощью метода length вы можете определить длину
файла в байтах:
public long length();
Ряд методов предназначен для выполнения как
обычного, так и форматированного ввода из файла.
Этот набор аналогичен методам, определенным для
потоков. Существуют также методы, позволяющие
выполнять обычную или форматированную запись в
файл с прямым доступом.
Описание примера
В этом разделе мы привели несложный пример
автономной программы Java, которая работает с
файлом методом прямого доступа. Вначале она
создает новый файл и записывает в него десять
строк вида "Record 0", "Record 1" и так далее.
Затем программа читает эти строки в обратном
порядке и отображает на консоли:
* Random Access File demonstration
Record 9
Record 8
Record 7
Record 6
Record 5
Record 4
Record 3
Record 2
Record 1
Record 0
Рассмотрим исходный текст приложения.
Внутри статического метода main, получающего
управление при запуске приложения, мы определили
несколько переменных.
Переменная i используется как переменная цикла:
int i;
В переменной data мы храним ссылку на файл, к
которому осуществляется прямой доступ:
RandomAccessFile data;
Текущая позиция в файле хранится в переменной dataPointer:
long dataPointer = 0;
Массив idx предназначен для хранения позиций
всех записей, добавленных в файл на первом этапе
работы приложения:
Vector idx = new Vector();
Строка s используется для временного хранения
записей, извлеченных из файла на втором этапе
работы приложения:
String s;
Все операции, связанные с файлами, могут
возбуждать исключения, поэтому мы их выполняем в
теле оператора try-catch:
try
{
. . .
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
Прежде всего мы создаем файл с именем direct.dat:
data = new RandomAccessFile(
"direct.dat", "rw");
Файл открывается для чтения и записи.
Далее мы добавляем в файл десять записей
(текстовых строк):
for(i = 0; i < 10; i++)
{
dataPointer = data.getFilePointer();
idx.addElement(new Long(dataPointer));
data.writeBytes("Record " + i + "\n");
}
Перед добавлением очередной записи мы получаем
текущую позицию в файле, вызывая для этого метод
getFilePointer, и сохраняем ее в массиве idx класса Vector.
Перед сохранением нам нужно преобразовать тип
данных из long в Long, что мы сделали с помощью
соответствующего конструктора.
Запись сохраняется методом writeBytes, способным
записывать в файл текстовые строки класса String.
На втором этапе добавленные записи читаются в
обратном порядке и отображаются на консоли:
for(i = 9; i >= 0; i--)
{
dataPointer = (long)
((Long)idx.elementAt(i)).doubleValue();
data.seek(dataPointer);
s = data.readLine();
System.out.println(s);
}
Здесь мы вначале извлекаем из массива idx
позицию записи с заданным номером и преобразуем
ее тип в long.
Далее мы выполняем позиционирование на запись
методом seek.
Затем запись читается методом readLine и
отображается на консоли.
Назад Вперед |