Чтение файлов из папки .tgz на лету - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь прочитать набор документов .xml, которые хранятся в каталоге .tgz на лету. Структура файла .tgz - это папка верхнего уровня 01 с подкаталогами A1, A2 и т. Д., И в каждом из этих каталогов Ax есть набор XML-документов, которые я хочу прочитать. например. 01 / A1 / 1234.xml

Пока что я могу разархивировать папку .tgz и открыть лежащую в ее основе папку верхнего уровня, но она считается пустой или не распознается как папка, если в ней должно быть несколько подкаталогов, в каждом из которых есть набор документов .xml.

if (filename.endsWith(".tgz")) {
    TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(filename)));
    TarArchiveEntry currentEntry = tarInput.getNextTarEntry();

    for(File F : currentEntry.getFile().listFiles())
        System.out.println(F.getName());
}

Когда этот блок выполняется, исключение пустого указателя генерируется при манипулировании папкой. Если я запускаю currentEntry.isDirectory(), он возвращает истину. Если я вместо этого бегу:

if (filename.endsWith(".tgz")) {
    TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(filename)));
    TarArchiveEntry currentEntry = tarInput.getNextTarEntry();
    System.out.println(currentEntry.getDirectoryEntries().length);

    for(TarArchiveEntry F : currentEntry.getDirectoryEntries())
        System.out.println(F.getName());
}

Строка System.out.println(currentEntry.getDirectoryEntries().length); печатает 0, когда она должна быть 100. При использовании любого из методов для циклического перебора файлов в currentEntry ничего не найдено.

Можно ли читать файлы, которые должны находиться в этой папке .tgz, не распаковывая ее полностью, манипулируя файлами, а затем удаляя файлы вручную?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

И getFile, и getDirectoryEntries работают только в том случае, если вы создали TarArchiveEntry из фактического File на вашем диске, чтобы записать их в архив. Они не предоставляют ничего полезного для записей, прочитанных из архива.

Архивы TAR не предоставляют произвольный доступ, все, что вы можете сделать, это просмотреть все записи с помощью getNextTarEntry и обработать те записи, которые вас интересуют (останавливается, когда getNextTarEntry возвращает null).

0 голосов
/ 01 мая 2018

У вас есть эта проблема, потому что вы закрываете br. Метод BufferedReader.close() закрывает основной поток - в данном случае TarArchiveInputStream. Вы должны избегать звонков br.close().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...