如何使用 XZ for Java 添加 ZipEntry

Posted

技术标签:

【中文标题】如何使用 XZ for Java 添加 ZipEntry【英文标题】:How to add ZipEntry using XZ for Java 【发布时间】:2021-05-06 07:42:02 【问题描述】:

我正在使用标准 ZipOutputStream 压缩一些 json 文件

ObjectMapper objectMapper = new ObjectMapper();
try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(outputFile + ".zip"))) 
    out.putNextEntry(new ZipEntry(jsonFileName + ".json"));
    objectMapper.writeValue(out, jsonDataList);

输出:

outputFile.zip\jsonFileName.json => jsonDataList contents

我想将其从 .zip 更改为 .7z 或 .xz 我目前正在为 Java 试用 XZ (https://tukaani.org/xz/java.html)

ObjectMapper objectMapper = new ObjectMapper();
try (XZOutputStream out = new XZOutputStream(Files.newOutputStream(outputFile + ".xz"), new LZMA2Options())) 
    objectMapper.writeValue(out, jsonDataList);
    out.finish();

输出:

outputFile.xz\DataTypeOfJsonDataList => jsonDataList contents

它的工作原理是没有错误,创建一个.xz文件,它确实包含一个.json文件(虽然文件名只是“jsonDataList”的数据类型减去“.json”扩展名)

如何指定内容的文件名? XZOutputStream 似乎没有办法添加 ZipEntry。

【问题讨论】:

xz 不是存档格式,它是一种压缩格式。 Zip 结合了两者。如果您想要压缩存档,请先使用tar 创建存档,然后将其压缩。您可以通过将 tar 输出流包装在 xz 输出流中来实现。 【参考方案1】:

xz 不是7z7z 是一种压缩存档格式,这意味着它可以包含多个文件以及一个目录结构。 xz 是一种单文件压缩格式。它可以与未压缩的 tar 存档格式结合使用,以制作不同的压缩存档格式,.tar.xz

【讨论】:

【参考方案2】:

感谢蜘蛛鲍里斯和马克阿德勒让我走上正轨。

我能够使用 org.apache.commons.compress.archivers.sevenz 包将条目添加到 7z 存档中

SevenZOutputFile sevenZOutput = new SevenZOutputFile(outputFile + ".7z");
SevenZArchiveEntry entry = sevenZOutput.createArchiveEntry(jsonFile, jsonFileName + ".json");
sevenZOutput.putArchiveEntry(entry);
sevenZOutput.write(objectMapper.writeValueAsBytes(data));
sevenZOutput.closeArchiveEntry();
sevenZOutput.close();

【讨论】:

以上是关于如何使用 XZ for Java 添加 ZipEntry的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中使用 xz 压缩时如何获得均匀压缩?

如何在 Java 中更快地解压 XZ 文件?

如何在android中使用XZ lib压缩/解压缩文件

如何使用 Java 中的循环在 3D 数组中添加元素?

java 读excel xlsx

使用 apache common compress/org.tukaani.xz 在 java 中解码 LZMA 压缩 zip 文件的问题