即时从 .tgz 文件夹中读取文件

Reading files from within a .tgz folder on the fly

我正在尝试读取一组动态存储在 .tgz 目录中的 .xml 文档。 .tgz 文件的结构是一个顶级文件夹 01,其中包含子目录 A1、A2 等,并且在每个 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() 它 returns 正确。如果我改为 运行:

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); 行在应该为 100 时打印了 0。当使用任一方法遍历 currentEntry 中的文件时,没有找到任何内容。

是否可以读取本应位于此 .tgz 文件夹中的文件,而无需将其完全解压、处理文件然后手动删除文件?

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

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

TAR 档案不提供随机访问,您所能做的就是使用 getNextTarEntry 遍历所有条目并处理您感兴趣的条目(在 getNextTarEntry returns null).