从Java中的zip提取后,保留文件校验和

问题描述

| 这是我要完成的工作: 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任务压缩处理为zip的文件夹。 3)将zip文件中的文件一一解压到指定的文件夹(为此使用common io和compression),并计算提取文件的校验和:
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对象有关(预压缩与未压缩检查)。如果我在每个文件的解压缩检查中都使用了“ new Adler32()”,而不是对所有文件都重复使用相同的Adler32,那么我会得到正确的结果。     

解决方法

        您是否尝试将所有文​​件串联在一起?如果是,则需要确保以相同的顺序“校验和”阅读它们。 如果否,则需要在计算每个文件的校验和之间调用ѭ2。您会注意到(在源代码中)Adler32是有状态的,这意味着您正在计算文件的校验和以及在第一部分中所有前面的校验和。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...