如何使用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
相关产品推荐
相关产品推荐

