Apache Commons Compress: 打开 .tar.gz

6

我正在开发一款软件,该软件将从tar.gz文件中获取信息,我正在使用Apache commons-compress库。但是我遇到了以下错误:

Caused by: java.lang.IllegalArgumentException: Invalid byte 4 at offset 0 in 'O�!�C' len=8
at org.apache.commons.compress.archivers.tar.TarUtils.parseOctal(TarUtils.java:134)
at org.apache.commons.compress.archivers.tar.TarUtils.parseOctalOrBinary(TarUtils.java:166)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:953)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:940)
at org.apache.commons.compress.archivers.tar.TarArchiveEntry.<init>(TarArchiveEntry.java:324)
at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:274)
... 2 more

使用的样本 tar.gz 文件是 eclipse-jee-luna-SR1-linux-gtk-x86_64.tar.gz

以下是使用该库的类:

public class TarGzBuildAdapter extends BuildAdapter {
    public TarGzBuildAdapter(File build) {
        super(build);
    }

    @Override
    public List<ArtifactInfo> getArtifactInfos() throws IOException {
        TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(
                new FileInputStream(this.build));
        TarArchiveEntry tarArchiveEntry;
        List<ArtifactInfo> artifactInfos = new LinkedList<ArtifactInfo>();

        while ((tarArchiveEntry = tarArchiveInputStream.getNextTarEntry()) != null) {
            System.out.println(String.format("Name: %s LinkName: %s Size: %Ld RealSize: %Ld",
                    tarArchiveEntry.getName(), tarArchiveEntry.getLinkName(),
                    tarArchiveEntry.getSize(), tarArchiveEntry.getRealSize()));
            artifactInfos.add(new ArtifactInfo(tarArchiveEntry.getName(), tarArchiveEntry
                    .getRealSize()));
        }

        tarArchiveInputStream.close();

        return artifactInfos;
    }
}

1
为了得到任何有意义的答案,您必须提供使用commons-compress编写的代码。 - PaulProgrammer
我敢打赌,错误在你的代码里而不是在Apache Commons中。 - m0skit0
你使用的 Apache commons compress 库是什么版本 - 是 1.3 吗? - Sigismundus
1个回答

5

您读取的文件不是一个 TAR 文件,而是 GZ 流。在使用 TarArchiveInputStream 之前,您需要先解压它。

tarArchiveInputStream = new TarArchiveInputStream(
                          new GzipCompressorInputStream(
                            new BufferedInputStream(
                              new FileInputStream(fileName))));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接