0

我在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一些存档列表之后关闭。肯定还在寻找提示。

4

0 回答 0