Список содержимого tar-архива (сжатие java commons) возвращает переменное количество записей, а затем исключение потока закрыто. Как исправить?

Я довольно долго исследовал эту проблему в 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;
}

Как упоминалось выше, я надеюсь получить список записей в архиве. К сожалению, похоже, что метод получает только случайное количество записей каталога. Это число варьируется для каждого архива (тестирование с 4 разными) от 0 до 12 записей. Возникающее исключение — это IOException, точнее Stream Closed.

Я не очень хорошо разбираюсь в библиотеках Apache Commons Compress (очевидно), и я действительно не знаю ни одного шестнадцатеричного редактора достаточно хорошо, чтобы копаться в архиве, чтобы увидеть, есть ли что-то не-POSIX, о которое он спотыкается. Однако я думаю, что условное выражение entry.isFile() позволит избежать этого осложнения.

Как я уже упоминал, любая помощь или ресурсы очень ценятся! ТИА!

РЕДАКТИРОВАТЬ: хотя код там (в ссылке на пост первого комментария), казалось, сводился к тому же, что и я, я действительно вырезал свой код и использовал то, что там было, практически дословно. . Все еще получил ту же самую ошибку: Stream Closed. Мне удалось найти кое-что, что может содержать подсказку; Я попытался заменить BufferedInputStream обертку оригинального InputStream, который я передал. Это немедленно вызвало ошибку Stream Closed, в отличие от BufferedInputStream закрытия после фрагмента листинга архива. Определенно все еще ищу подсказки.


person Damon Getsman    schedule 12.12.2017    source источник
comment
Вы проверили stackoverflow.com/a/7556307/3179169. В комментариях говорится о той же проблеме, что и у вас, и там может быть опубликована рекомендация.   -  person clinomaniac    schedule 12.12.2017
comment
Я не увидел там ничего для решения или рекомендации. :П   -  person Damon Getsman    schedule 13.12.2017
comment
stackoverflow.com/a/14211580/3179169 Вы пытались сделать это таким образом?   -  person clinomaniac    schedule 13.12.2017
comment
Хотя код там, казалось, сводился в основном к тому, что я использовал, я действительно вырезал свой код и использовал то, что там было, практически дословно. По-прежнему возникает точно такая же ошибка: Поток закрыт. Мне удалось найти кое-что, что может содержать подсказку; Я попытался поменять упаковку BufferedInputStream на оригинальную упаковку InputStream, которую я передал. Это немедленно вызвало ошибку Stream Closed, а не BufferedInputStream, закрывающуюся после фрагмента листинга архива. Определенно все еще ищу подсказки.   -  person Damon Getsman    schedule 27.12.2017