Шаг 100.
Язык программирования Java.
Интерфейс Checksum. Классы CRC32 и Adler32

На этом шаге мы рассмотрим интерфейс Checksum, а также классы CRC32 и Adler32

Бывает полезным вычисления контрольной суммы файла. Это может понадобиться для проверки сохранности файла, который передается по сети или же хранится в небезопасных условиях. Библиотека языка программирования Java предоставляет интерфейс Checksum для работы с контрольной суммой файлов.

В интерфейсе Checksum перечислены несколько методов. Они представлены в таблице 1 ниже.

Таблица 1. Функции интерфейса Checksum
Функция Описание
void update(int b) Обновляет текущее значение контрольной суммы значением b.
void update(byte b[], int off, int len) Обновляет текущее значение контрольной суммы значениями, которые записаны в массиве b, находящиеся на позициях [off, off + len -1].
long getValue() Функция для получения текущей контрольной суммы.
void reset() Функция сбрасывает значение контрольной суммы в исходное состояние.

В библиотеке Java есть две реализации интерфейса Checksum. Это классы CRC32 и Adler32. Разница между ними в том, что CRC32 считает контрольную сумму дольше Adler32, но более точнее.

Для того чтобы организовать в своем приложении вычисление контрольной суммы файла с применением классов CRC32 или Adler32, вам вначале нужно создать объект одного из этих классов, воспользовавшись для этого соответствующим конструктором. Заметим, что конструкторы этих классов не имеют параметров.

Далее вам нужно создать входной поток для исследуемого файла и организовать его чтение блоками в цикле. На каждой итерации цикла вы должны вызывать метод update класса CRC32 или Adler32.

После завершения цикла искомая контрольная сумма может быть получена методом getValue, определенным в этих классах.


Приведем ниже пример подсчета контрольной суммы файла. Название файла передается программе через командную строку. Полученная контрольная сумма выводится на экран.

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.Adler32;
import java.util.zip.CRC32;

/**
 * Пример использования классов Adler32 и CRC32
 * */
public class Main {
    private static File file;

    /**
     * Функция для проверки аргументов командной строки
     * @param args аргументы командной строки
     * @return true, если мы корректно передали неообходимые аргументы, 
     *                                                    и false в противном случае
     * */
    private static boolean checkArgs(String[] args) {
        /*Проверяем что программе передан путь к файлу*/
        if (args.length == 0) {
            System.out.println("Введите путь до файла");
            return false;
        }

        String fileName = args[0];
        file = new File(fileName);

        /*Проверяем наличие файла на диске*/
        if (!file.exists()) {
            System.out.println("Данного файла не существует");
            return false;
        }

        return true;
    }

    public static void main(String[] args) {
        /*Проверяем аргументы командной строки*/
        if (checkArgs(args)) {
            /*Создаем объект класса CRC32*/
            CRC32 crc32 = new CRC32();
            /*Создаем объект класса Adler32*/
            Adler32 adler32 = new Adler32();

            byte[] buffer = new byte[1024];
            int countBytes = 0;

            try (FileInputStream in = new FileInputStream(file)) {
                /*читаем байты из файла*/
                while ((countBytes = in.read(buffer)) != -1) {
                    /*обнавляем контрольную сумму у объектов*/
                    crc32.update(buffer, 0, countBytes);
                    adler32.update(buffer, 0, countBytes);
                }
            } catch (IOException ignore) {}

            /*Выводим контрольные суммы на экран*/
            System.out.println("CheckSum: " + crc32.getValue() + "(CRC32)");
            System.out.println("CheckSum: " + adler32.getValue() + "(Adler32)");
        }
    }
}

Проект можно взять здесь


Рис. 1. Вывод программы


На следующем шаге мы рассмотрим интерфейс Enumeration и класс ZipFile

Предыдущий шаг Содержание