我正在使用Apache Commons Compress库来迭代.tar.gz文件。我的问题是,如果我使用.getNextTarEntry()迭代tar文件,我总是可以假设tarArchiveEntry对象是以前条目的后代,这些目录是目录。我用简单的英语解释这个问题所以这里是代码示例:
try (
FileInputStream fileInputStream = new FileInputStream(tarFile);
GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream);
TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(gzipInputStream);) {
TarArchiveEntry tarArchiveEntry;
while (null != (tarArchiveEntry = tarArchiveInputStream.getNextTarEntry())) {
if (tarArchiveEntry.isDirectory()) {
currentDirEntry = tarArchiveEntry
} else {
//Is tarAchiveEntry always "child" of currentDirEntry
}
}
}
我的问题是我正在处理巨大的.tar.gz文件(几个GB大,包含> 100k文件)并且我不想为每个文件解析父目录名(它们包含重要信息) 。我只想解析一次目录名,并假设所有下一个条目都是该目录的子项。如果我点击下一个目录,则此过程从头开始。
我无法使用DIY方法,因为我不确定在创建.tar.gz文件时会影响文件顺序,但由于tar格式不包含任何索引(据我所知?),这是有道理的目录条目列在其内容之前。
任何帮助表示感谢。
答案 0 :(得分:1)
由于tar档案没有索引,因此commons-compress无法判断最近解压缩目录中的另一个文件是否会在以后发生(不解压缩整个文件)。因此,您的问题实际上是关于压缩程序的行为,而不是您的解压缩程序。
一般来说,tar文件中的条目顺序没有限制(甚至它们的唯一性 - 以后的条目可能会覆盖之前的条目)。我的命令行tar
会按照他们在命令行上传递的顺序将文件打包到存档中,因此我可以像a/foo b/bar a/baz b/quux
那样进行备用,并按照他们的顺序排列#39}例如,我可以这样做,以便在档案中将类似文件保持在彼此附近,以便使用基于字典(滑动窗口)的算法(如gzip)更好地进行压缩。
只有在您对创建了您正在处理的文件的归档程序有特殊了解的情况下,才能假设目录中的所有文件都在tar存档中连续列出。