Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений
Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

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 и отображается на консоли.


Назад Вперед

[Назад]