Я довольно долго исследовал эту проблему в 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
закрытия после фрагмента листинга архива. Определенно все еще ищу подсказки.
BufferedInputStream
на оригинальную упаковкуInputStream
, которую я передал. Это немедленно вызвало ошибку Stream Closed, а неBufferedInputStream
, закрывающуюся после фрагмента листинга архива. Определенно все еще ищу подсказки. - person Damon Getsman   schedule 27.12.2017