为何复制生成的Jar文件与原文件大小不一致?如何解决?
问题
我编写了一段Python脚本,将旧Jar文件中的文件添加到新Jar文件中,但生成的patched.jar(6,773 KB)与原文件original.jar(6,786 KB)大小不一致。运行脚本前我已删除patched.jar。脚本代码如下:
import zipfile zin = zipfile.ZipFile("original.jar") zout = zipfile.ZipFile("patched.jar", 'a') for entry in zin.infolist(): buffer = zin.read(entry.filename) zout.writestr(entry, buffer)
由于Jar文件无需压缩,我需要新文件与原文件大小完全一致,但未找到解决方法。请问有什么办法可以实现?
编辑补充:并非压缩问题!经提示是元数据差异,通过7zip发现原归档文件的Characteristics设置为Descriptor UTF8,而新文件无此设置。
解决方法
问题根源是Python的zipfile模块默认不会保留原Jar文件的UTF-8描述符标志,且追加模式可能引入冗余数据。要完全复刻原文件的大小和元数据,按以下方式修改脚本:
- 改用写入模式
'w'创建输出文件,避免追加模式的额外数据 - 给每个
ZipInfo对象添加0x800标志位,开启UTF-8描述符特性 - 指定
ZIP_STORED压缩方式,确保和原文件一样不压缩
修改后的脚本:
import zipfile with zipfile.ZipFile("original.jar", 'r') as zin: with zipfile.ZipFile("patched.jar", 'w', zipfile.ZIP_STORED) as zout: for entry in zin.infolist(): buffer = zin.read(entry.filename) # 开启UTF-8描述符标志 entry.flag_bits |= 0x800 zout.writestr(entry, buffer)
运行这个脚本后,生成的patched.jar会和原文件大小完全一致,且保留原有的Descriptor UTF8特性。
内容的提问来源于stack exchange,提问作者stavratum
相关产品推荐
相关产品推荐

