| |
данных
имеются следующие записи:
Номер записиСмещение в файле данныхПоле nameПоле account00Ivanov1000112Petrov
2000224Sidoroff3000
При последующих запусках каждый раз в файл данных будут добавляться
приведенные выше записи.
Так как поле name имеет переменную длину, для обеспечения возможности
прямого доступа к записи по ее номеру необходимо где-то хранить смещения всех
записей. Мы это делаем в файле индексов, дамп которого на момент после первого
запуска приложения представлен на рис. 2.12.
Рис. 2.12. Дамп файла индекса
Файл индексов хранит 8-байтовые смещения записей файла данных в формате long.
Зная номер записи, можнор легко вычислить смещение в файле индексов, по
которому хранится смещение нужной записи в файле данных. Если извлечь это
смещение, то можно выполнить позиционирование в файле данных с целью чтения
нужной записи, что и делает наше приложение.
После добавления трех записей в базу данных приложение извлекает три записи
в обратном порядке, то есть сначала запись с номером 2, затем с номером 1, и,
наконец, с номером 0. Извлеченные записи отображаются в консольном окне
приложения (рис. 2.13).
Рис. 2.13. Отображение записей базы данных приложением DirectFileAccess
Исходные тексты приложения
Исходные тексты приложения DirectFileAccess приведены в листинге 2.9.
Листинг 2.9. Файл DirectFileAccess\DirectFileAccess.java
// =========================================================
// Прямой доступ к файлу с помощью класса RandomAccessFile
//
// (C) Фролов А.В, 1997
//
// E-mail: [email protected]
// WWW: http://www.glasnet.ru/~frolov
// или
// http://www.dials.ccas.ru/frolov
// =========================================================
import java.io.*;
import java.util.*;
// =========================================================
// Класс DirectFileAccess
// Главный класс приложения
// =========================================================
public class DirectFileAccess
{
// -------------------------------------------------------
// main
// Метод, получающий управление при запуске приложения
// -------------------------------------------------------
public static void main(String args[])
{
// Массив для ввода строки с клавиатуры
byte bKbdInput[] = new byte[256];
try
{
// Создаем новую базу данных
SimpleDBMS db = new SimpleDBMS(
"dbtest.idx", "dbtest.dat");
// Добавляем в нее три записи
db.AddRecord("Ivanov", 1000);
db.AddRecord("Petrov", 2000);
db.AddRecord("Sidoroff", 3000);
// Получаем и отображаем содержимое первых трез
// записей с номерами 2, 1 и 0
System.out.println(db.GetRecordByNumber(2));
System.out.println(db.GetRecordByNumber(1));
System.out.println(db.GetRecordByNumber(0));
// Закрываем базу данных
db.close();
// После ввода любой строки завершаем работу программы
System.out.println("Press to terminate...");
System.in.read(bKbdInput);
}
catch(Exception ioe)
{
System.out.println(ioe.toString());
}
}
}
// =========================================================
// Класс SimpleDBMS
// Простейшая база данных
// =========================================================
class SimpleDBMS
{
// Файл индексов
|
|