Сохранение контрольной суммы файла после извлечения из zip в java - PullRequest
0 голосов
/ 14 июня 2011

Вот что я пытаюсь выполнить: 1) Рассчитать контрольную сумму всех файлов, которые будут добавлены в zip-файл.В настоящее время используется Apache Commons io:

final Checksum oChecksum = new Adler32();
...

//for every file iFile in folder
long lSum = (FileUtils.checksum(iFile, oChecksum)).getValue();
//store this checksum in a log

2) Сжать папку, обработанную в виде почтового индекса, используя задачу Ant zip.3) Извлеките файлы из zip-файла один за другим в указанную папку (используя для этого как общие, так и сжатые данные) и вычислите контрольную сумму извлеченного файла:

final Checksum oChecksum = new Adler32();    
...
    ZipFile myZip = new ZipFile("test.zip");
    ZipArchiveEntry zipEntry = myZip.getEntry("checksum.log"); //reads the filename from the log
    BufferedInputStream myInputStream = new BufferedInputStream(myZip.getInputStream(zipEntry));
    File destFile = new File("/mydir", zipEntry.getName());
    lDestFile.createNewFile();
    FileUtils.copyInputStreamToFile(myInputStream, destFile);

long newChecksum = FileUtils.checksum(destFile, oChecksum).getValue();

Проблема в том, чтозначение из newChecksum не совпадает со значением из исходного файла.Размеры файлов совпадают на диске.Забавно, что если я запускаю команды cksum или md5sum для обоих файлов непосредственно на терминале, они одинаковы для обоих файлов.Несоответствие происходит только из Java.

Это правильный способ приблизиться к нему или есть какой-либо способ сохранить значение контрольной суммы после извлечения?

Я также попытался использовать CheckedInputStream, но это также даетя отличаюсь от java.

РЕДАКТИРОВАТЬ: Это, похоже, связано с используемым объектом Adler32 (проверки до и после распаковки).Если я выполню «новый Adler32 ()» в проверке распаковки для каждого файла вместо того, чтобы повторно использовать один и тот же Adler32 для всех, я получу правильный результат.

1 Ответ

1 голос
/ 14 июня 2011

Пытаетесь ли вы для всех конкатенированных файлов?Если да, вам нужно убедиться, что вы читаете их в том же порядке, «проверяя» их.Если нет, вам нужно вызвать checksum.reset() между вычислениями контрольной суммы для каждого файла.Вы заметите (если взглянуть на источник), что Adler32 имеет состояние, что означает, что вы вычисляете контрольную сумму файла плюс все предыдущие в первой части.

...