我在google和stackoverflow上研究了这个问题很长一段时间。不幸的是,我似乎找不到任何似乎可以解决此问题的资源。诚然,我的 search-fu 不是最好的;非常感谢任何帮助、示例或指向相关资源的指针。
以下代码是我列出来自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;
}
如上所述,我希望获得档案中的条目列表。不幸的是,该方法似乎只能获取随机数量的目录条目。这个数字因每个存档而异(使用 4 个不同的测试),从 0 个条目到 12 个条目。抛出的异常是IOException,具体来说是Stream Closed。
我不太精通 Apache Commons Compress 库(显然),而且我真的不太了解任何十六进制编辑器,无法在档案中四处挖掘,看看是否有一些非 POSIX 的东西绊倒了。不过,我认为entry.isFile()
条件可以避免这种复杂性。
正如我所提到的,非常感谢任何帮助或资源!蒂亚!
编辑:虽然那里的代码(在第一条评论的帖子参考中)似乎基本上可以归结为与我使用的相同,但实际上我确实删除了我的代码并使用了那里的代码,几乎逐字记录。仍然得到完全相同的错误:Stream Closed
。我确实设法找到了一些可能有线索的东西。我试着换掉我交出BufferedInputStream
的原件的包装InputStream
。这会立即导致Stream Closed错误,而不是在BufferedInputStream
一些存档列表之后关闭。肯定还在寻找提示。