Java中的GZIP多个文件创建Tar存档
时间:2020-01-09 10:35:28 来源:igfitidea点击:
GZIP通常用于压缩GZIP格式的单个文件,如果要在Java中使用GZIP格式压缩多个文件,则需要两个步骤。
- 首先将多个文件与tar一起存档,
- 然后使用gzip压缩以创建.tar.gz压缩档案。
在本文中,我们将看到在Java中使用gzip压缩多个文件的整个过程,方法是在Java中创建一个tar文件,然后对其进行gzip压缩,从而创建一个.tar.gz归档文件。
Gzip Java中的多个文件
此处给出的Java程序可将多个文件存档到tar中,然后压缩为GZIP,使用Apache Commons Compress库,该库可从以下路径下载
此处使用的版本是commons-compress-1.18,因此commons-compress-1.18.jar已添加到类路径。
从Apache Commons Compress库中,有两个文件用于创建tar存档。
- TarArchiveEntry –表示Tar归档文件中的条目。因此,使用TarArchiveEntry将所有压缩的目录和文件添加到tar存档中。
- TarArchiveOutputStream –此类具有一些方法,用于放置存档条目,然后通过写入此流来写入文件的内容。 TarArchiveOutputStream将GZIPOutputStream包装在程序中。
Java程序–创建tar存档和Gzip多个文件
Java程序中使用的目录结构如下所示,有一个父目录测试,其中包含两个子目录docs和prints和四个文件
$ ls -R test test: aa.txt bb.txt docs prints test/docs: display.txt test/prints: output
在程序中,我们需要遍历目录结构以存档所有文件和目录。如果它是目录,则只需归档该条目,就文件而言,除了归档该条目外,还将文件内容写入流中。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;
public class GZipMultipleFiles {
public static void main(String[] args) {
String PARENT_DIRECTORY = "/home/theitroad/Documents/test";
GZipMultipleFiles gzipMultipleFiles = new GZipMultipleFiles();
gzipMultipleFiles.createTarArchive(PARENT_DIRECTORY);
}
public void createTarArchive(String parentDir){
TarArchiveOutputStream tarArchive = null;
try {
File root = new File(parentDir);
// create output name for tar archive
FileOutputStream fos = new FileOutputStream(root.getAbsolutePath().concat(".tar.gz"));
GZIPOutputStream gzipOS = new GZIPOutputStream(new BufferedOutputStream(fos));
tarArchive = new TarArchiveOutputStream(gzipOS);
addToArchive(parentDir, "", tarArchive);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
tarArchive.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void addToArchive(String filePath, String parent, TarArchiveOutputStream tarArchive) throws IOException {
File file = new File(filePath);
// Create entry name relative to parent file path
//for the archived file
String entryName = parent + file.getName();
System.out.println("entryName " + entryName);
// add tar ArchiveEntry
tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName));
if(file.isFile()){
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
// Write file content to archive
IOUtils.copy(bis, tarArchive);
tarArchive.closeArchiveEntry();
bis.close();
}else if(file.isDirectory()){
// no content to copy so close archive entry
tarArchive.closeArchiveEntry();
// if this directory contains more directories and files
// traverse and archive them
for(File f : file.listFiles()){
// recursive call
addToArchive(f.getAbsolutePath(), entryName+File.separator, tarArchive);
}
}
}
}
tar档案中条目的输出
entryName test entryName test/docs entryName test/docs/display.txt entryName test/bb.txt entryName test/prints entryName test/prints/output entryName test/aa.txt

