java.io.IOException:检测到解析标头时出错,在Java中解压缩.tgz文件

时间:2015-02-12 20:23:50

标签: java apache tar apache-commons-compress

我正在使用apache commons来解压缩.tgz文件。我从压缩库中收到错误。我试过压缩版本1.9和1.8.1,我仍然有同样的错误。

这只发生在某些文件上,但是当我手动下载文件并验证它时,没有问题。

$ gunzip -c foo.tgz | tar t > /dev/null
$ 

但是我看到这个堆栈跟踪来自commons库。

Severe:   java.io.IOException: Error detected parsing the header
at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:257)    
...
Caused by: java.lang.IllegalArgumentException: Invalid byte 0 at offset 5 in '05412{NUL}11' len=8
at org.apache.commons.compress.archivers.tar.TarUtils.parseOctal(TarUtils.java:138)

问题来自

entry = tarIn.getNextTarEntry();

以下是代码:

try {
        TarArchiveInputStream tarIn = new TarArchiveInputStream(
                new GZIPInputStream(
                        new BufferedInputStream(
                                new FileInputStream(
                                        tempDirPath + fileName))));

        TarArchiveEntry entry = tarIn.getNextTarEntry();

        while (entry != null) {
            File path = new File(tempDirPath, entry.getName());
            if (entry.isDirectory()) {
                path.mkdirs();
            } else {          
                path.createNewFile();
                byte[] read = new byte[1024];
                BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(path));
                int len;
                while ((len = tarIn.read(read)) != -1) {
                    bout.write(read, 0, len);
                }
                bout.close();
                read = null;
            }
            entry = tarIn.getNextTarEntry();
        }
        tarIn.close();
    } catch (Throwable t) {
        t.printStackTrace();
    }

1 个答案:

答案 0 :(得分:1)

尝试使用 GzipCompressorInputStream 装饰您的inputStream。

TarArchiveInputStream tarIn = new TarArchiveInputStream( new GzipCompressorInputStream(new FileInputStream(fileName)))