Исключение произошло при распаковке файла Tar с использованием сжатия Apache Commons - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь распаковать файл tar на map, используя сжатие Apache commons в Java. Я могу распаковать большинство файлов tar, но немногие из них терпят неудачу с приведенным ниже исключением. Я не уверен, что является причиной проблемы. файл tar поврежден? Я могу распаковать файл с помощью 7zip в Windows, но тот же файл не удается, когда программно распаковать его. Я использую Appache Commons-Compress 1.18

java.io.IOException: Error detected parsing the header
at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:285)
at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextEntry(TarArchiveInputStream.java:552)

Caused by: java.lang.IllegalArgumentException: At offset 124, 12 byte binary number exceeds maximum signed long value
at org.apache.commons.compress.archivers.tar.TarUtils.parseBinaryBigInteger(TarUtils.java:213)
at org.apache.commons.compress.archivers.tar.TarUtils.parseOctalOrBinary(TarUtils.java:177)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:1283)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:1266)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.<init>(TarArchiveEntry.java:404)
at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:283)
... 25 more

ниже мой код

public static Map<String, byte[]> unTarToMap(byte[] b) throws IOException, ArchiveException {
        final Map<String, byte[]> untaredFiles = new HashMap<>();
        ByteArrayInputStream is = new ByteArrayInputStream(b);
        final TarArchiveInputStream debInputStream = (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is);
        TarArchiveEntry entry;
        while ((entry = (TarArchiveEntry) debInputStream.getNextEntry()) != null) {
            final ByteArrayOutputStream outputFileStream = new ByteArrayOutputStream();
            IOUtils.copy(debInputStream, outputFileStream);
            outputFileStream.close();
            untaredFiles.put(entry.getName(), outputFileStream.toByteArray());
        }
        debInputStream.close();
        return untaredFiles;
    }

1 Ответ

0 голосов
/ 13 января 2019

Возможно, вы используете ограничение Commons Compress. По смещению 124 своего заголовка в записи tar хранится его размер. Commons Compress пытается представить размер в виде Java long, который имеет максимальное значение, довольно большое (2 ^ 63-1), но в теории записи tar могут быть больше.

Либо у вас есть архив tar с большими записями (7z должен быть в состоянии сказать вам, насколько большим он считает эту запись), либо вы попали в ошибку. Существует множество различных диалектов tar, и вполне возможно, что Commons Compress считает, что ваш архив использует определенный диалект, когда это не так. В этом случае лучше всего открыть отчет об ошибках с помощью Apache Commons Compress на https://issues.apache.org/jira/projects/COMPRESS/ и - если возможно - предоставить архив, вызывающий исключение.

Кстати, номера строк в вашей трассировке стека не совпадают с Compress 1.18, поэтому вы, вероятно, не используете ту версию, которую считаете нужной.

...