如何使用Java将.tar文件放入.tar.gz文件中?

时间:2019-07-13 17:11:53

标签: java tar

我要创建一个.tar.gz,其中包含.tar文件的子目录。

我现在有两个独立的工作,我能够创建一个包含所需信息的data.tar文件。我也有一个.tar.gz工作,但是子目录不是.tar文件,例如: data.tar(正在运行)
|-目录/
|-文件

file.tar.gz(正在运行)
| -data /
|-目录/
| ---文件

目标: file.tar.gz(不起作用)
| -data.tar
|-目录/
| ---文件

要将.tar添加到我的.tar.gz中,我正在执行以下操作:创建.tar文件,然后将该.tar文件添加到我的.tar.gz

public class TarArchiveOutput extends Closeable {

    public BufferedOutputStream       bOut;
    public GzipCompressorOutputStream gzOut;
    public TarArchiveOutputStream     tOut;
    private boolean isZipped;

    public TarArchiveOutput(OutputStream oStream, boolean zip) throws IOException {
        bOut  = null;
        gzOut = null;
        tOut  = null;
        isZipped = zip;
        if(isZipped) {
            bOut = new BufferedOutputStream(oStream, 1024 * 10240);
            gzOut = new GzipCompressorOutputStream(bOut);
            tOut = new TarArchiveOutputStream(gzOut);
            tOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
        } else {
            bOut = new BufferedOutputStream(oStream, 1024 * 10240);
            tOut = new TarArchiveOutputStream(bOut);    
            tOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
        }
    }

    public void addFileToOutput(String path, String base) throws IOException {
        File f = new File(path);
        if(!base.endsWith("/"))
            base = base+"/";
        String entryName = base + f.getName();
        TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);
        tOut.putArchiveEntry(tarEntry);

        if (f.isFile()) {
            IOUtils.copy(new FileInputStream(f), tOut);
            tOut.closeArchiveEntry();
        } else {
            tOut.closeArchiveEntry();
            File[] children = f.listFiles();
            if (children != null) {
                for (File child : children) {
                    addFileToOutput(child.getAbsolutePath(), entryName + "/");
                }
            }
        }
    }

    @Override
    public void close() {
        if(isZipped) gzOut.close();
        tOut.close();
        bOut.close();
    }
}

要仅创建.tar文件,请执行以下操作:

TarArchiveOutput dataTarOutput = new TarArchiveOutput(new FileOutputStream(new File("data.tar")), false);
//Add files

创建.tar.gz

TarArchiveOutput tarGZOutput = new TarArchiveOutput(new FileOutputStream(new File("file.tar.gz")), true);
tarGZOutput.addFileToOutput("data.tar", "");

我希望格式如下: file.tar.gz
| -data.tar
|-目录/
| ---文件

实际结果是.tar.gz,当未压缩/未压缩时,它包含一个data.tar文件,但是当我尝试解压缩时,它变成了data.tar.cpgz(无限循环),无法解压缩。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

要GZip TAR存档,您需要执行以下操作:

TarArchiveOutput dataTarGzOutput = new TarArchiveOutput(new GZIPOutputStream(new FileOutputStream(new File("data.tar.gz"))), false);