即时从 .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 文件夹中的文件,而无需将其完全解压、处理文件然后手动删除文件?
您遇到此问题是因为您正在关闭 br
。 BufferedReader.close()
方法关闭底层流 - 在本例中为 TarArchiveInputStream
。你应该避免调用 br.close()
.
getFile
和 getDirectoryEntries
仅当您从磁盘上的实际 File
创建了 TarArchiveEntry
以便将它们写入存档时才有效。它们不提供任何对从存档中读取的条目有用的信息。
TAR 档案不提供随机访问,您所能做的就是使用 getNextTarEntry
遍历所有条目并处理您感兴趣的条目(在 getNextTarEntry
returns null
).
我正在尝试读取一组动态存储在 .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 文件夹中的文件,而无需将其完全解压、处理文件然后手动删除文件?
您遇到此问题是因为您正在关闭 br
。 BufferedReader.close()
方法关闭底层流 - 在本例中为 TarArchiveInputStream
。你应该避免调用 br.close()
.
getFile
和 getDirectoryEntries
仅当您从磁盘上的实际 File
创建了 TarArchiveEntry
以便将它们写入存档时才有效。它们不提供任何对从存档中读取的条目有用的信息。
TAR 档案不提供随机访问,您所能做的就是使用 getNextTarEntry
遍历所有条目并处理您感兴趣的条目(在 getNextTarEntry
returns null
).