当前位置: 首页 > 知识库问答 >
问题:

使用Apache Commons compress取消Tar文件的Tar时发生异常

宗政德宇
2023-03-14

我正在尝试使用Java中的Apache commons compress将tar文件解压缩为map。我能够解压缩大部分的tar文件,但很少有失败的,除了下面的例外。我不确定是什么引起了这个问题。tar文件是否已损坏?我可以在windows中使用7zip解压缩文件,但相同的文件在编程解压缩时失败。我正在使用Appache commons-compress1.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个答案

范朗
2023-03-14

您可能遇到了公共压缩的限制。tar条目在其头部的偏移量124处存储其大小。Commons Compress尝试将大小表示为Javalong,它有一个相当大的最大值(2^63-1),但理论上tar条目可能更大。

要么你有一个tar归档,里面有那么大的条目(7z应该能够告诉你它认为条目有多大),要么你遇到了一个bug。tar有很多不同的方言,很可能Commons Compress认为你的归档使用的是特定的方言,而不是。在这种情况下,最好使用Apache Commons Compress在https://issues.Apache.org/jira/projects/Compress/上打开一个bug报告,如果可能的话,提供导致异常的存档。

顺便说一句,堆栈跟踪中的行号与compress1.18不匹配,所以您可能没有使用您认为自己是的版本。

 类似资料:
  • 我有一个tar存档,其中包含一些其他tar存档。下面的示例完美地提取了primary.tar文件,但我在访问其中的其他.tar文件时遇到了问题。 这将返回以下内容: 所以我可以访问tar1.tar文件对象。但是,我无法弄清楚如何从tar1.tar中获取成员或内容。

  • 我正在使用和来备份。在执行makefile时,tar命令显示。在这种情况下, < li >当警告出现时,tar包正常 < li >但它会停止tar命令以进行后续备份 < li >显示警告的文件实际上没有改变-出现警告真是奇怪 < li >显示警告的文件随机出现,我的意思是,每次我运行makefile时,显示警告的文件都是不同的 < Li > < code >-ignore-failed-read

  • 使用Runtime方法运行下面的命令,使用java生成目录的tar 用于创建tar的Java代码 Java进程是一个服务器,它在每次输入后处理后创建tar文件。在处理了几个输入之后,流程停留在tar步骤。 运行 以查找进程是否卡住,并显示在输出下方 我手动运行了输入目录的tar命令,它工作得很好。任何指示为什么会发生这种情况? 更新: 对于如下所示的目录结构 进程正在为其生成tar的目录是di1。

  • 问题内容: 我想使用Java将文件夹压缩为tar文件(以编程方式)。我认为必须要有一个开源或库。但是,我找不到这种方法。 或者,我可以制作一个zip文件并将其扩展名重命名为.tar吗? 任何人都可以建议图书馆这样做吗?谢谢! 问题答案: 您可以使用jtar-Java Tar库。 从他们的网站上获取: JTar是一个简单的Java Tar库,它提供了一种使用IO流创建和读取tar文件的简便方法。该A

  • 我正在尝试使用以下命令提取.gz文件。 提取成功,但分配的用户ID是1003

  • 我有一个.tar文件,其中包含文件夹中的许多.gz文件。这些 gz 文件中的每一个都包含一个.txt文件。与此问题相关的其他堆栈溢出问题旨在提取文件。 我试图反复阅读每一个的内容。txt文件,因为。焦油很大。 首先我阅读了. tar文件的内容: 或在Unix中: 然后我尝试使用tarfile提取文件方法,但我得到一个错误:“模块'tarfile'没有属性'提取文件'”。此外,我甚至不确定这是正确的