Я пытаюсь распаковать файл 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;
}