gpt4 book ai didi

java - 使用 java 迭代 tar.gz 文件

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:01 25 4
gpt4 key购买 nike

我正在使用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 格式不包含任何索引(据我所知?),因此将目录条目列在其内容之前是有意义的。

感谢任何帮助。

最佳答案

由于 tar 存档没有索引,commons-compress 无法判断最近解压的目录中是否会出现另一个文件(无需解压整个文件)。因此,您的问题实际上是关于压缩程序的行为,而不是您的解压缩器。

一般来说,tar 文件中的条目顺序没有限制(甚至它们的唯一性——后面的条目可能会覆盖前面的条目)。我的命令行 tar 会按照文件在命令行上传递的顺序将文件打包到存档中,因此我可以像 a/foo b/bar a/baz b/quux 一样交替使用,这就是它们打包的顺序。例如,我可能会这样做,以便在存档中保持相似的文件彼此相邻,以便使用 gzip 等基于字典(滑动窗口)的算法更好地进行压缩。

仅当您对创建您正在处理的文件的归档程序有特殊了解时,您才可以假设目录中的所有文件都在 tar 归档中连续列出。

关于java - 使用 java 迭代 tar.gz 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com