我已经在google和stackoverflow上研究了这个问题很长一段时间了。 不幸的是,我似乎找不到任何似乎可以解决这个问题的资源。不可否认,我的搜索不是最好的;任何有关资源的帮助,示例或指示都将非常感激。
以下代码是我列出 TarArchiveInputStream 中的存档内容的方法:
public static List<String> tarListDir(InputStream incoming)
throws Exception {
TarArchiveInputStream tarInput = new TarArchiveInputStream(incoming);
TarArchiveEntry entry = null;
List<String> ouah = new ArrayList<String>();
try {
while ((entry = tarInput.getNextTarEntry()) != null) {
if (!entry.isFile()) {
continue;
}
ouah.add(entry.getName());
if (RecScan.verbose || RecScan.debugging) {
if (entry.isFile()) {
System.out.print("file: \t");
} else if (entry.isDirectory()) {
System.out.print("dir: \t");
} else {
System.out.print("wut: \t");
}
System.out.println(ouah.get(ouah.size() - 1));
}
}
} catch (Exception e) {
tarInput.close();
throw new Exception("Closed w/exception: " + e.getMessage());
}
if (RecScan.verbose || RecScan.debugging) {
System.out.println("Closing tarInput normally");
}
tarInput.close();
return ouah;
}
如上所述,我希望获得存档中条目的 List 。不幸的是,该方法似乎只获得随机数量的目录条目。这个数字因每个存档(用4个不同的测试)而变化,从0个条目到12个条目。抛出的异常是 IOException , Stream Closed 是特定的。
我不太熟悉Apache Commons Compress库(很明显),而且我真的不知道任何十六进制编辑器是否足以在存档中挖掘,看看是否存在非POSIX的东西,它是磕磕绊绊的。我认为entry.isFile()
条件会避免这种并发症。
正如我所提到的,任何帮助或资源都非常感谢! TIA!
编辑:虽然那里的代码(在第一条评论的帖子参考中)似乎基本上与我使用的相同,我确实切出了我的代码并使用那里的代码,几乎是逐字的。仍然得到完全相同的错误:Stream Closed
。我确实找到了一些可能含有线索的东西;我尝试换掉我递交的原始BufferedInputStream
的{{1}}包裹。这会立即导致 Stream Closed 错误,而在归档列表之后会导致InputStream
关闭。绝对还在寻找提示。