使用java

时间:2015-09-03 08:09:36

标签: java archive compression lz4

我使用了adrien grand的java存储库,将JNI提供给原始的LZ4本机代码。

我想在给定的输入目录下压缩多个文件,但LZ4不支持多个文件压缩,就像在java zip包中一样,所以我尝试了另一种方法,我想把tar所有的输入文件作为输入管道输入到LZ4压缩器,我使用Jtar java包来备份我的所有输入文件。 除此之外还有其他更好的方法吗?

我遇到了许多示例代码来压缩一些字符串以及如何正确实现LZ4压缩器和解压缩器。 现在我想知道如何为多个文件实际实现它? 我还想澄清一下我是否朝着正确的方向前进。

在对所有文件进行去皮后,根据示例代码使用说明,我现在将我的去皮文件转换为字节数组,以便将其提供给压缩器模块。为此,我使用了apache-common-ioutil包。因此,考虑到我有很多文件作为输入,并且导致巨大的tar,根据我的说法,将它总是转换为字节数组似乎无效。 我想首先知道这是否有效?还是有更好的方法比这更好地使用LZ4包吗?

我遇到的另一个问题是最终结果。在压缩了配衡文件之后,我会得到像MyResult.lz4文件那样的最终结果作为输出但是我无法使用存档管理器(我使用的是ubuntu)解压缩它,因为它不支持这种格式。 我也不清楚我必须在这里使用的存档和压缩格式。我也想知道最终结果应该是什么格式。所以现在我从用户的角度讲,考虑如果我提供他/她我正在为用户生成备份的情况使用传统的.zip,.gz或任何已知格式,用户可以自己解压缩它。据我所知LZ4并不意味着我期望用户也应该知道这样的格式对吗?看到这样的格式,他甚至可能会感到困惑。所以这意味着从.lz4到.zip格式的转换似乎也毫无意义。我已经看到所有输入文件的皮重过程是一个耗时的过程,所以我想知道它对性能有多大影响。正如我在java zip包中看到的那样,压缩多个输入文件并没有似乎根本不是问题。所以在lz4旁边我遇到了Apache common compress和TrueZIP。我还遇到了几个关于它们的堆栈溢出链接,这帮助我学到了很多东西。截至目前,我真的很想使用LZ4进行压缩,特别是因为它的性能,但我遇到了这些障碍。任何对LZ4软件包有深入了解的人都可以为我的所有查询和问题提供解决方案以及简单的实现。感谢。

我为包含许多文件的输入计算的时间,
 皮重时间:4704毫秒
 将文件转换为字节数组所需的时间:7 ms
 压缩时间:33毫秒

2 个答案:

答案 0 :(得分:3)

一些事实:

  1. LZ4与GZIP没有什么不同:它是一个涉及压缩的单一关注项目。它不涉及存档结构。这是故意的。
  2. Adrien Grand的LZ4 lib产生的输出与命令行LZ4实用程序不兼容。这也是故意的。
  3. 你使用tar的方法似乎没问题,因为这是用GZIP完成的。
  4. 理想情况下,您应该使tar代码生成一个立即压缩的流,而不是首先完全存储在RAM中。这是使用Unix管道在命令行中实现的。

答案 1 :(得分:1)

我遇到了同样的问题。 LZ4 for Java的当前版本与后来开发的LZ4标准不兼容以处理流,但是,在项目repo中有一个补丁支持压缩/解压缩流的标准,我可以确认它与命令行兼容工具。你可以在https://github.com/jpountz/lz4-java/pull/61找到它。

在Java中,您可以将它与Apache Commons压缩中的TarArchiveInputStream一起使用。

如果你想要一个例子,我使用的代码是在Maven工件io.github.htools 0.27-SNAPSHOT(或在github)的类io.github.htools.io.compressed.TarLz4FileWriter和(已过时) class)io.github.htools.io.compressed.TarLz4File展示它是如何工作的。在HTools中,tar和lz4会自动通过ArchiveFile.getReader(String filename)和ArchiveFileWriter(String filename,int compressionlevel)使用,前提是你的文件名以.tar.lz4结尾