| |
записи - в конец файла индекса. Поэтому перед началом своей работы текущая
позиция обоих указанных файлов устанавливается на конец файла.
Для установки мы применили метод seek из класса RandomAccessFile, передав
ему в качестве параметра значение длины файла в байтах, определенное при помощи
метода length из того же класса:
idx.seek(idx.length());
dat.seek(dat.length());
Перед тем как добавлять новую запись в файл данных, метод AddRecord
определяет текущую позицию в файле данных (в данном случае это позиция конца
файла) и записывает эту позицию в файл индекса:
idxFilePointer = dat.getFilePointer();
idx.writeLong(idxFilePointer);
Далее метод AddRecord выполняет сохранение полей записи в файле данных. Для
записи строки вызывается метод writeBytes, а для записи численного значения
типа int - метод writeInt:
dat.writeBytes(name + "\r\n");
dat.writeInt(account);
Обратите внимение, что к строке мы добавляем символы возврата каретки и
перевода строки. Это сделано исключительно для того чтобы обозначить конец
строки текстового поля.
Метод GetRecordByNumber
Метод GetRecordByNumber позволяет извлечь произвольную запись из файла
данных по ее порядковому номеру.
Напомним, что смещения всех записей хранятся в файле индексов и имеют
одинаковую длину 8 байт. Пользуясь этим, метод GetRecordByNumber вычисляет
смещение в файле индекса простым умножением порядкового номера записи на длину
переменной типа long, то есть на 8 байт, а затем выполняет позиционирование:
idx.seek(nRec * 8);
После этого метод GetRecordByNumber извлекает из файла индексов смещение
нужной записи в файле данных, вызывая для этого метод readLong, а затем
выполняет позиционирование в файле данных:
idxFilePointer = idx.readLong();
dat.seek(idxFilePointer);
Поля записи читаются из файла данных в два приема. Вначале читается строка
текстового поля, а затем - численное значение, для чего вызываются,
соответственно, методы readLine и readInt:
str = dat.readLine();
account = new Integer(dat.readInt());
Полученные значения полей объединяются в текстовой строке и записываются в
переменную sRecord:
sRecord = new String("> " + account + ", " + str);
Содержимое этой переменной метод GetRecordByNumber возвращает в качестве
извлеченной строки записи базы данных.
3 СОЗДАНИЕ СЕТЕВЫХ ПРИЛОЖЕНИЙ
Когда в 30 томе “Библиотеки системного программиста” мы начинали разговор
про язык программирования Java, то отмечали, что он специально ориентирован на
глобальные сети, такие как Internet. В этой главе мы начнем знакомство с
конкретными классами Java, разработанными для сетевого программирования. На
примере наших приложений вы сможете убедиться, что классы Java действительно
очень удобны для создания сетевых приложений.
В этой главе мы рассмотрим два аспекта сетевого программирования. Первый из
них касается доступа из приложений Java к файлам, расположенным на сервере Web,
второй - создания серверных и клиентских приложений с использованием сокетов.
Напомним, что из соображений безопасности алпетам полностью запрещен доступ
к локальным файлам рабочей станции, подключенной к сети. Тем не менее, аплет
может работать с файлами, расположенными на серверах Web. При этом можно
использовать входные и выходные потоки, описанные нами в предыдущей главе.
Для чего аплетам обращаться к файлам сервера Web?
Таким аплетам можно найти множество применений.
Представьте себе, например, что вам нужно отображать у пользователя
диаграмму, исходные данные для построения которой находятся на сервере Web. Эту
задачу можно решить, грубо говоря, двумя способами.
Первый заключается в том, что вы создаете расширение сервера Web в виде
приложения CGI или ISAPI, которое на основании исходных данных динамически
формирует графическое изображение диаграммы в виде файла GIF и посылает его
пользователю. Что касается расширения сервера Web, то вы сможете его создать,
пользуясь 29 томом “Библиотеки системного программиста”, который называется
“Сервер Web
|
|