Назад
Вперед
8.5. Подсчет контрольной суммы аплета
В этом примере мы показываем еще одно
применение для класса URL - определение
контрольной суммы байт-кода аплета. Аплет в
процессе инициализации загружает файл своего
собственного байт-кода с сервера Web и затем
вычисляет его контрольную сумму. Такая техника
может применяться для контроля неизменности
аплетов.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java JDK 1.1)
Немного теории
В библиотеке классов Java есть средства,
предназначенные для подсчета контрольных сумм
по алгоритмам CRC-32 и Adler-32. Мы уже рассказывали о
них в разделе "7.25.
Вычисление контрольной суммы файла".
Интересно, что эти средства можно использовать
и для удаленного контроля сохранности файлов,
расположенных в каталогах сервера Web, например,
аплетов. Для этого вам потребуются класс URL и
CheckedInputStream.
С первым классом вы уже знакомы по предыдущим
примерам этого раздела. Что же касается класса
CheckedInputStream, то он обеспечивает автоматический
подсчет контрольной суммы при чтении файла.
Алгоритм подсчета передается конструктору этого
класса через второй параметр, например:
InputStream is;
Checksum cs = new CRC32();
CheckedInputStream cis =
new CheckedInputStream(is, cs);
После завершения операции чтения потока класса
CheckedInputStream контрольная сумма может быть получена
методом getChecksum(), определенным в этом классе.
Описание примера
Наш пример представляет собой аплет, в окне
которого отображается адрес URL файла с байт-кодом
аплета и контрольная сумма CRC-32 этого файла (рис.
1).
Рис. 1. Аплет показывает в окне свою контрольную
сумму
Рассмотрим исходный текст аплета.
Главный класс аплета CheckCheckSum создан на базе
класса Applet. В нем мы определили три поля и три
метода.
Поля класса CheckCheckSum
Поле u хранит адрес URL, созданный аплетом для
собственного файла байт-кода:
URL u;
В поле szChecksum мы будем записывать текстовое
представление вычисленной контрольной суммы
файла байт-кода:
String szChecksum = null;
И, наконец, поле cs хранит ссылку на объект
класса Checksum, выполняющий подсчет контрольной
суммы:
Checksum cs = new CRC32();
Мы инициализируем его для применения алгоритма
CRC-32.
Метод init класса CheckCheckSum
Метод init получает управление при инициализации
аплета. Прежде всего он создает объект класса URL
для файла собственного байт-кода:
try
{
u = getCodeBase();
u = new URL(u.toString() +
"CheckCheckSum.class");
. . .
}
catch(Exception ioe)
{
showStatus(ioe.toString());
}
Эта операция выполняется в два приема. Вначале
с помощью метода getCodeBase мы получаем адрес URL
каталога, содержащего байт-код аплета, а затем
создаем объект класса URL для самого файла
байт-кода.
Следующий этап - создание потока класса InputStream и
потока класса CheckedInputStream:
InputStream is = u.openStream();
CheckedInputStream cis =
new CheckedInputStream(is, cs);
Здесь мы применили метод openStream, который в
данном случае возвратит входной поток для файла
байт-кода аплета.
Затем метод calculate, определенный в нашем
приложении, вычисляет контрольную сумму файла:
szChecksum = calculate(cis);
Метод init также устанавливает желтый цвет фона
окна аплета:
setBackground(Color.yellow);
Метод calculate класса CheckCheckSum
Метод calculate выполняет считывание входного
потока, переданного ему через первый параметр:
byte[] buf = new byte[8000];
int nLength = 0;
try
{
while(true)
{
int nReaded = is.read(buf);
if(nReaded == -1)
break;
}
is.close();
}
catch(Exception ioe)
{
showStatus(ioe.toString());
}
Прочитанные данные помещаются в буфер buf, но
никак не используются. Здесь важен процесс
чтения, так как во время этого процесса
происходит подсчет контрольной суммы.
Далее подсчитанная сумма извлекается и
возвращается вызвавшему методу:
String s = (new Long(
is.getChecksum().getValue())).toString();
return s;
Метод paint класса CheckCheckSum
Работа метода paint заключается в отображении
адреса URL файла с байт-кодом аплета и контрольной
суммы этого файла, вычисленной методом init на
этапе инициализации:
public void paint(Graphics g)
{
g.drawString("My own URL: " + u.toString(),
10, 30);
g.drawString("My own CRC-32: " + szChecksum,
10, 50);
}
Назад Вперед |