import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.io.IOUtils; import java.io.*;import java.util.zip.GZIPOutputStream; public class TarUtils { public static void compress(String sourceFolder, String tarGzPath) throws IOException {createTarFile(sourceFolder, tarGzPath); } privatestaticvoidcreateTarFile(StringsourceFolder,StringtarGzPath){
TarArchiveOutputStreamtarOs =null;
try{
// 创建一个 FileOutputStream 到输出文件(.tar.gz)
FileOutputStreamfos =newFileOutputStream(tarGzPath);
// 创建一个 GZIPOutputStream,用来包装 FileOutputStream 对象
GZIPOutputStreamgos =newGZIPOutputStream(newBufferedOutputStream(fos));
// 创建一个 TarArchiveOutputStream,用来包装 GZIPOutputStream 对象
tarOs =newTarArchiveOutputStream(gos);
// 若不设置此模式,当文件名超过 100 个字节时会抛出异常,异常大致如下:
// is too long ( > 100 bytes)
// 具体可参考官方文档:http://commons.apache.org/proper/commons-compress/tar.html#Long_File_Names
tarOs.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
addFilesToTarGZ(sourceFolder,"",tarOs);
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
tarOs.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
publicstaticvoidaddFilesToTarGZ(StringfilePath,Stringparent,TarArchiveOutputStreamtarArchive)throwsIOException{
Filefile =newFile(filePath);
// Create entry name relative to parent file path
StringentryName =parent +file.getName();
// 添加 tar ArchiveEntry
tarArchive.putArchiveEntry(newTarArchiveEntry(file,entryName));
if(file.isFile()){
FileInputStreamfis =newFileInputStream(file);
BufferedInputStreambis =newBufferedInputStream(fis);
// 写入文件
IOUtils.copy(bis,tarArchive);
tarArchive.closeArchiveEntry();
bis.close();
}elseif(file.isDirectory()){
// 因为是个文件夹,无需写入内容,关闭即可
tarArchive.closeArchiveEntry();
// 读取文件夹下所有文件
for(Filef :file.listFiles()){
// 递归
addFilesToTarGZ(f.getAbsolutePath(),entryName +File.separator,tarArchive);
}
}
}
publicstaticvoidmain(String[]args)throwsIOException{
// 测试一波,将 filebeat-7.1.0-linux-x86_64 打包成名为 filebeat-7.1.0-linux-x86_64.tar.gz 的 tar 包
compress("/Users/a123123/Work/filebeat-7.1.0-linux-x86_64","/Users/a123123/Work/tmp_files/filebeat-7.1.0-linux-x86_64.tar.gz");
} }