有没有一种很好的方法来处理Java中的LZMA * fast *压缩?

时间:2013-06-06 21:58:44

标签: java java-native-interface 7zip lzma

7-Zip作者提供的原生Java LZMA SDK可以正常工作,但不足以满足我的需求。高级实现似乎无法处理算法所需的低级别工作。

我找到了7-Zip-JBinding,它在C ++ dll上实现了JNI封面,它附带了7-Zip。这会以合理的速度处理解压缩,但它处于测试版状态,目前不支持压缩

无论如何,我的问题分为两部分:

  1. 我的假设是DLL包装器是我最好的快速Java实现的选择吗?
  2. 如果是这样,是否有一个我应该看的预先存在的项目,或者我是否必须从头开始写一些东西?

2 个答案:

答案 0 :(得分:0)

它可能不是您的选择,但我在使用ProcessBuilder执行外部7z进程方面取得了很大的成功。使用LZMA2并降低压缩级别也大大加快了压缩时间。当然有便携性问题。

您可能想查看XZ for Java。 XZ使用LZMA2压缩,但具有更适合Unix环境的不同格式。最新的7zip应该能够提取.XZ档案。

答案 1 :(得分:0)

查看Apache Commons Compress,它具有LZMA2格式的出色API。使用的实现是XZ for Java,因此您还需要将此依赖项添加到您的代码中。 Examples页面有一个代码段,显示了如何使用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只支持读取这种格式,XZ for Java也是如此。 LZMA2包含在XZ存档格式中,但这绝对是要走的路,因为它是支持的算法/格式,也可以在其他平台上使用。 Linux上还有一个名为" xz"的命令行工具。可用于压缩/解压缩文件。