Java TrueZip随机访问功能

Java TrueZip随机访问功能,java,compression,gzip,truezip,archive-tar,Java,Compression,Gzip,Truezip,Archive Tar,我试图了解如何在Java 6环境中使用TrueZIP(使用文件类)随机遍历.tar.gz中的文件。我发现它使用Java7的路径,但是,我无法给出一个如何随机读取Java6上的归档文件的示例 此外,“随机”读取是指它首先解压缩整个归档文件,还是读取压缩文件中的部分?这样做的目的是,我想从文件中检索一些基本信息,而不必为了读取而解压缩整个文件(即用户名) 我并不特别了解TrueZip,但至少就Zip、RAR和Tar而言,您可以访问单个文件并检索它们的详细信息,甚至可以在不接触包的其余部分的情况下提取

我试图了解如何在Java 6环境中使用TrueZIP(使用
文件
类)随机遍历.tar.gz中的文件。我发现它使用Java7的
路径
,但是,我无法给出一个如何随机读取Java6上的归档文件的示例


此外,“随机”读取是指它首先解压缩整个归档文件,还是读取压缩文件中的部分?这样做的目的是,我想从文件中检索一些基本信息,而不必为了读取而解压缩整个文件(即用户名)

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

此外,“随机”读取是否意味着它首先解压缩 整个档案

如果TrueZip遵循Zip/RAR/Tar格式,则不会解压缩整个归档文件

目的是我想从数据库中检索一些基本信息 文件,而无需解压整个内容即可读取(即 用户名)


如前所述,这应该很好——我不知道TrueZip API,但文件容器格式允许您在不读取任何数据的情况下检查文件信息,并且可以选择在不接触容器中任何其他文件的情况下提取/读取文件内容。

zran的源代码注释描述了这些工具的工作原理:

总之,可以说,为了生成必要的索引,必须处理完整的文件。 这比实际解压要快得多。
该索引允许将文件拆分为块,这些块可以解压缩,而无需先解压缩这些块。用于模拟随机访问。

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


因此,为了将
.tar.gz
分开,您需要将整个内容解压缩到临时文件或内存中(如果不是太大),然后您可以跳转到底层
.tar
文件中的特定条目,尽管这必须通过从一个标题跳到另一个标题来顺序完成,由于
tar
不包括文件的中心索引/目录。

Zip、RAR和tar文件有一个中心目录,对于前两种格式,每个文件都单独压缩。但是OP要求立即压缩tar.gz文件,这意味着在访问单个文件之前通常必须解压缩整个存档。@Robert实际上,
tar
没有中心目录/索引。但是,每个文件头中都有足够的信息来确定要跳到哪里才能获取下一个文件头。虽然速度不快,但至少只需执行一次。正确。或者至少您需要解压缩到所需的文件。如果要对同一个.tar.gz文件进行大量随机访问,那么可以将整个过程解压缩一次,并构建入口点索引。然后你可以更接近真正的随机访问,速度取决于入口点的密度。@MarkAdler当然,还有一个警告,一个
tar
文件可以包含多个具有相同名称(但不一定是相同内容)的文件。虽然这在现在的野外很少见,但功能仍然存在,因此在您要查找的文件的第一个实例处停止解压缩并不总是“正确的事情”。TAR.GZ文件格式对于随机访问来说是一个糟糕的选择,原因是twalberg解释道。改用ZIP文件格式。