【问题标题】:Reading files from within a .tgz folder on the fly即时从 .tgz 文件夹中读取文件
【发布时间】:2018-05-01 14:48:00
【问题描述】:

我正在尝试动态读取存储在 .tgz 目录中的一组 .xml 文档。 .tgz 文件的结构是包含子目录 A1、A2 等的*文件夹 01,在每个 Ax 目录中都有一组我希望阅读的 .xml 文档。例如。 01/A1/1234.xml

到目前为止,我可以解压缩 .tgz 文件夹并显示底层的*文件夹,但当它应该包含多个子目录时,它被认为是空的或不被识别为文件夹,每个子目录中都有一组 .xml 文档。

if (filename.endsWith(".tgz")) {
    TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(filename)));
    TarArchiveEntry currentEntry = tarInput.getNextTarEntry();

    for(File F : currentEntry.getFile().listFiles())
        System.out.println(F.getName());
}

运行此块时,操作文件夹时会引发空指针异常。如果我运行currentEntry.isDirectory(),它会返回 true。如果我改为运行:

if (filename.endsWith(".tgz")) {
    TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(filename)));
    TarArchiveEntry currentEntry = tarInput.getNextTarEntry();
    System.out.println(currentEntry.getDirectoryEntries().length);

    for(TarArchiveEntry F : currentEntry.getDirectoryEntries())
        System.out.println(F.getName());
}

System.out.println(currentEntry.getDirectoryEntries().length); 行打印 0 而它应该是 100。当使用任一方法循环通过 currentEntry 中的文件时,什么都找不到。

是否可以在不完全解压缩、操作文件然后手动删除文件的情况下读取该 .tgz 文件夹中的文件?

【问题讨论】:

    标签: java gzip tar apache-commons compression


    【解决方案1】:

    getFilegetDirectoryEntries 仅在您从磁盘上的实际File 创建TarArchiveEntry 以便将它们写入存档时才有效。它们没有为从档案中读取的条目提供任何有用的信息。

    TAR 存档不提供随机访问,您所能做的就是循环使用 getNextTarEntry 的所有条目并处理您感兴趣的条目(当 getNextTarEntry 返回 null 时停止)。

    【讨论】:

      【解决方案2】:

      您遇到此问题是因为您正在关闭brBufferedReader.close() 方法关闭底层流 - 在本例中为 TarArchiveInputStream。你应该避免打电话给br.close()

      【讨论】:

      • 感谢您的回答,这是我遇到的一个问题,但不是核心问题。我已更新问题以关注主要问题。