Вот что я пытаюсь выполнить: 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 для всех, я получу правильный результат.