首页 > 解决方案 > 即时从 .tgz 文件夹中读取文件

问题描述

我正在尝试读取存储在 .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);行在应该为 100 时打印 0。当使用任一方法循环通过 currentEntry 中的文件时,什么都找不到。

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

标签: javagziptarapache-commonscompression

解决方案


你有这个问题,因为你正在关闭br. 该BufferedReader.close()方法关闭底层流 -TarArchiveInputStream在这种情况下。你应该避免调用br.close().


推荐阅读