【问题标题】:Is there a good way to handle *fast* compression to LZMA in Java?有没有一种在 Java 中处理 *fast* 压缩到 LZMA 的好方法?
【发布时间】:2015-02-26 19:42:23
【问题描述】:
7-Zip 作者提供的原生 Java LZMA SDK 可以工作,但速度还不够快,无法满足我的需求。高级实现似乎无法处理算法所需的低级工作。
我找到了7-Zip-JBinding,它在 7-Zip 附带的 C++ dll 上实现了 JNI 覆盖。这会以合理的速度处理解压缩,但它处于测试阶段,目前不支持压缩。
无论如何,我的问题分为两部分:
- 我是否假设 DLL 包装器是实现快速 Java 的最佳选择?
- 如果是这样,是否有我应该研究的预先存在的项目,还是我必须从头开始写一些东西?
【问题讨论】:
标签:
java
java-native-interface
7zip
lzma
【解决方案1】:
这可能不是您的选择,但我通过使用 ProcessBuilder 简单地执行外部 7z 进程取得了巨大的成功。使用 LZMA2 并降低压缩级别也大大加快了压缩时间。当然存在可移植性问题。
您可能想查看XZ for Java。 XZ 使用 LZMA2 压缩,但具有更适合 Unix 环境的不同格式。最新的 7zip 应该可以解压 .XZ 档案了。
【解决方案2】:
看看Apache Commons Compress,它为 LZMA2 格式提供了出色的 API。使用的实现是XZ for Java,因此您还需要将此依赖项添加到您的代码中。 Examples 页面有一个代码 sn-p 显示如何使用 XZCompressorInputStream 进行解压缩:
FileInputStream fin = new FileInputStream("archive.tar.xz");
BufferedInputStream in = new BufferedInputStream(fin);
FileOutputStream out = new FileOutputStream("archive.tar");
XZCompressorInputStream xzIn = new XZCompressorInputStream(in);
final byte[] buffer = new byte[buffersize];
int n = 0;
while (-1 != (n = xzIn.read(buffer))) {
out.write(buffer, 0, n);
}
out.close();
xzIn.close();
您应该知道 LZMA 是一种已弃用的格式 - Apache Commons Compress 仅支持读取此格式,对于 Java 的 XZ 也是如此。 LZMA2 包装在 XZ 存档格式中,但这绝对是要走的路,因为它是受支持的算法/格式,并且在其他平台上也可用。 Linux 上还有一个名为“xz”的命令行工具,可用于压缩/解压缩文件。