如何使用 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
不是7z
。 7z
是一种压缩存档格式,这意味着它可以包含多个文件以及一个目录结构。 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 apache common compress/org.tukaani.xz 在 java 中解码 LZMA 压缩 zip 文件的问题