You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何复制生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:25:15