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

时间:2018-05-01 14:48:01

标签: java gzip tar apache-commons compression

我正在尝试读取一组存储在.tgz目录中的.xml文档。 .tgz文件的结构是顶级文件夹01,其子目录为A1,A2等,并且在每个Ax目录中都有一组我希望阅读的.xml文档。例如。 01 / A1 / 1234.xml

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

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

是否可以读取应该在此.tgz文件夹中的文件而不完全解压缩,操作文件然后手动删除文件?

2 个答案:

答案 0 :(得分:1)

您遇到此问题是因为您正在关闭brBufferedReader.close()方法关闭基础流 - 在这种情况下为TarArchiveInputStream。你应该避免打电话给br.close()

答案 1 :(得分:1)

getFilegetDirectoryEntries只有在您从磁盘上的实际TarArchiveEntry创建File才能将其写入存档时才有效。它们不会为从存档中读取的条目提供任何有用的信息。

TAR档案不提供随机访问,您可以做的就是遍历getNextTarEntry的所有条目并处理您感兴趣的条目(getNextTarEntry返回null时停止)。