我要创建一个.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(无限循环),无法解压缩。在此先感谢您的帮助!
答案 0 :(得分:0)
要GZip TAR存档,您需要执行以下操作:
TarArchiveOutput dataTarGzOutput = new TarArchiveOutput(new GZIPOutputStream(new FileOutputStream(new File("data.tar.gz"))), false);