2012-10-05 48 views
3

我想了解如何在Java 6环境中使用TrueZIP随机遍历.tar.gz中的文件/文件(使用Files类)。我发现它使用Java 7的Path,但是,我不能拿出一个关于如何随机读取Java 6上的档案的例子。TrueZip随机存取功能

此外,“随机”阅读意味着它首先解压缩整个归档,还是它读取压缩文件中的部分?目的是我想从文件中检索一些基本信息,而不必解压缩整个东西来读取它(即用户名)。

+0

由于twalberg解释的原因,TAR.GZ文件格式对于随机访问来说是一个可怕的选择。改为使用ZIP文件格式。 –

回答

1

我并不特别了解TrueZip,但至少在Zip,RAR和Tar方面,您可以访问单个文件并检索有关它们的详细信息,甚至在不触及包的其余部分的情况下提取它们。

另外,做“随机”读意味着它先解压缩 整个存档

如果TrueZip如下邮编/ RAR/tar格式,那么它解压缩整个档案。

的目的是,我想要从该 文件中的一些基本信息,而无需解压缩整个事情只是阅读它(即 用户名)。

如前所述,这应该是很好 - 我不知道特别TrueZip API,但文件容器格式允许你检查文件信息,而不必读取数据的单个位,以及可选提取/读取文件内容而不触及容器中的任何其他文件。 ZRAN的

+0

Zip,RAR和Tar文件具有一个中央内容表,对于前两种格式,每个文件都被单独压缩。但是OP要求tar.gz文件一次压缩,这意味着在访问单个文件之前通常需要解压缩整个压缩文件。 – Robert

+0

@Robert实际上,'tar'没有中央目录/索引。但是,每个文件头都有足够的信息来确定要跳到哪里以获取下一个文件头。 – twalberg

0

源代码注释说明如何这样的工具工作: http://svn.ghostscript.com/ghostscript/tags/zlib-1.2.3/examples/zran.c

总之可以说,完整的文件具有产生必要的索引进行处理。 这比实际解压所有东西要快得多。 索引允许将文件拆分成可以解压缩的块,而无需先解压缩块。这用于模拟随机访问。

+0

速度并不快,但至少你只需要做一次。 –

3

gzip用于压缩文件(特别是.tar.gz文件)的方法通常意味着输出文件不是随机可访问的 - 您需要从整个文件到当前块的符号表和其他上下文甚至是能够解压缩该块以查看其中的内容。这是它通过ZIP/pkzip实现(某种程度上)更好的压缩方式之一,ZIP/pkzip在将每个文件添加到容器归档文件之前分别压缩每个文件,从而能够搜索特定文件并解压缩该文件。

因此,为了选择.tar.gz,您需要将整个事件解压缩到临时文件或内存中(如果它不是太大),那么您可以跳转到底层的特定条目.tar文件,尽管这必须通过从头部跳到头部而顺序完成,因为tar不包括文件的中央索引/目录。

+0

正确。或者至少你需要解压到所需的文件。如果你要在同一个.tar.gz文件中进行大量的随机访问,那么你可以将整个事情解压缩一次,并建立一个入口点索引。然后你可以更接近真正的随机访问,速度取决于入口点的密度。 –

+0

@MarkAdler当然,还有一个警告:'tar'文件可以包含多个具有相同名称的文件(但不一定是相同的内容)。虽然目前这种情况在野外看起来并不常见,但功能仍然存在,所以在寻找文件的第一个实例时停止解压并不总是“正确的事情”。 – twalberg