读取Jar包并写入新文件后体积变小的原因排查
Jar包复制后体积差异的原因分析
你的代码看似只是原封不动复制Jar包内容,但生成的临时Jar体积出现差异,主要是以下几个原因:
压缩设置与元数据不一致
原Jar中的每个JarEntry都带有压缩方式、修改时间、CRC校验值等元数据。当你把原JarEntry写入新的JarOutputStream时,输出流可能会重新计算这些元数据,或者使用默认的压缩策略(比如原Jar中某些文件是未压缩的,新输出流默认启用了压缩,反之亦然),单个条目的体积变化累积起来,就造成了整体Jar的体积差异。Jar结构细节未完全保留
Jar文件包含一些额外的结构信息,比如目录条目的存储格式、签名相关文件(如果原Jar有签名,META-INF下的.SF/.DSA等文件)。复制过程中,JarOutputStream不会完全复刻原Jar的这些结构细节,比如签名文件会因为元数据变化而失效,或者目录条目的属性被重置,进而影响整体文件大小。特殊条目的处理差异
原Jar中可能存在空目录、空文件这类特殊条目,JarOutputStream对这些条目的默认处理方式和原Jar可能不同,比如空目录的存储大小、属性设置有细微差别,也会导致整体体积变化。
要验证的话,可以用解压工具分别打开原Jar和临时Jar,对比每个文件的大小、压缩状态,以及META-INF目录下的文件内容差异,就能定位具体是哪些条目导致的体积变化。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

