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

如何使用Apache Zip工具在Java中修改ZIP版本为3.0?

解决Apache Commons Compress生成ZIP 3.0版本归档问题

一、修正Apache Commons Compress的配置

你之前仅设置了单个ZipArchiveEntry的版本,但zipinfo显示的归档全局版本由ZipArchiveOutputStream的属性控制,而非单个条目。调整代码如下:

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;

public class ZipVersionFix {
    public static void main(String[] args) throws Exception {
        try (ZipArchiveOutputStream zos = new ZipArchiveOutputStream(new FileOutputStream("output.zip"))) {
            // 设置归档的「创建者版本」为3.0(十进制30对应ZIP规范的3.0版本)
            zos.setMadeBy(30);
            // 设置打开归档所需的「最低版本」为3.0
            zos.setVersionNeededToExtract(30);

            // 添加文件条目(可选:给单个条目同步设置版本)
            ZipArchiveEntry entry = new ZipArchiveEntry("test.txt");
            entry.setVersionRequired(30);
            entry.setVersionMadeBy(30);
            zos.putArchiveEntry(entry);
            
            zos.write("sample content".getBytes(StandardCharsets.UTF_8));
            zos.closeArchiveEntry();
        }
    }
}

关键说明:zipinfo输出的version字段对应ZIP文件头的version made by和version needed to extract,必须通过ZipArchiveOutputStream的全局设置生效,单个条目的设置仅影响该条目自身的版本标记,不改变归档的全局版本显示。如果仍不生效,建议升级Apache Commons Compress到最新稳定版(如1.24.0及以上),旧版本可能存在字段覆盖问题。

二、替代库方案:Zip4j

如果Commons Compress的调整仍无法满足需求,可使用专门的ZIP处理库Zip4j,它直接支持设置ZIP版本:

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.ZipVersion;
import java.io.File;

public class Zip4jExample {
    public static void main(String[] args) throws Exception {
        ZipParameters params = new ZipParameters();
        params.setVersion(ZipVersion.ZIP_3_0); // 直接指定ZIP 3.0版本
        params.setMadeBy(ZipVersion.ZIP_3_0.getCode());

        try (ZipFile zipFile = new ZipFile("output.zip")) {
            zipFile.addFile(new File("test.txt"), params);
        }
    }
}

三、跨平台集成CLI工具方案

如果必须依赖系统原生zip命令,可通过ProcessBuilder跨平台调用:

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class CliZipExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        List<String> command;
        String os = System.getProperty("os.name").toLowerCase();
        
        if (os.contains("win")) {
            // Windows 10+ 自带tar命令支持ZIP 3.0
            command = Arrays.asList("tar", "-caf", "output.zip", "--format=zip", "test.txt");
        } else {
            // Linux/macOS 用原生zip命令(默认生成3.0版本)
            command = Arrays.asList("zip", "-o", "output.zip", "test.txt");
        }

        ProcessBuilder pb = new ProcessBuilder(command);
        pb.inheritIO(); // 重定向控制台输出
        Process process = pb.start();
        
        int exitCode = process.waitFor();
        if (exitCode != 0) {
            throw new IOException("Zip命令执行失败,退出码:" + exitCode);
        }
    }
}

注意:Windows 10之前的系统没有自带tar命令,需提前安装或改用第三方工具(如7-Zip)。

内容的提问来源于stack exchange,提问作者Fedir Staryk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:34:59