我试图了解如何在 Java 6 环境中使用 TrueZIP 随机遍历 .tar.gz 中的文件(使用 Files
类)。我发现了它使用 Java 7 的实例Path
,但是,我想不出一个关于如何在 Java 6 上随机读取存档的示例。
此外,“随机”读取是否意味着它首先解压缩整个存档,还是读取压缩文件中的部分?目的是我想从文件中检索一些基本信息,而不必为了读取它而解压缩整个内容(即用户名)。
我试图了解如何在 Java 6 环境中使用 TrueZIP 随机遍历 .tar.gz 中的文件(使用 Files
类)。我发现了它使用 Java 7 的实例Path
,但是,我想不出一个关于如何在 Java 6 上随机读取存档的示例。
此外,“随机”读取是否意味着它首先解压缩整个存档,还是读取压缩文件中的部分?目的是我想从文件中检索一些基本信息,而不必为了读取它而解压缩整个内容(即用户名)。
gzip
用于压缩文件(尤其是文件)的方法.tar.gz
通常意味着输出文件不可随机访问 - 您需要从整个文件到当前块的符号表和其他上下文,甚至能够将该块解压缩到看看里面有什么。这是它实现(某种程度上)比 ZIP/pkzip 更好的压缩的方法之一,后者在将每个文件添加到容器存档之前单独压缩每个文件,从而能够查找特定文件并仅解压缩该文件。
因此,为了.tar.gz
分开,您需要将整个内容解压缩到临时文件或内存中(如果它不是太大),然后您可以跳转到基础.tar
文件中的特定条目,尽管这必须通过从标题跳到标题按顺序完成,因为tar
不包括文件的中央索引/目录。
我不知道特别是 TrueZip,但至少在 Zip、RAR 和 Tar 方面,您可以访问单个文件并检索有关它们的详细信息,甚至可以在不触及包的其余部分的情况下提取它们。
此外,“随机”读取是否意味着它首先解压缩整个存档
如果 TrueZip 遵循 Zip/RAR/Tar 格式,则它不会解压缩整个存档。
目的是我想从文件中检索一些基本信息,而不必为了读取它而解压缩整个内容(即用户名)。
和以前一样,这应该没问题——我特别不知道 TrueZip API,但是文件容器格式允许您检查文件信息而无需读取任何数据,并且可以选择提取/读取文件内容而无需接触任何其他内容容器中的文件。
zran 的源代码注释描述了这些工具是如何工作的: http ://svn.ghostscript.com/ghostscript/tags/zlib-1.2.3/examples/zran.c
总之,可以说必须处理完整的文件以生成必要的索引。这比实际解压缩所有内容要快得多。该索引允许将文件拆分为可以解压缩的块,而无需之前解压缩这些块。这用于模拟随机访问。