1.1 添加 Maven 依賴html
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.12</version> </dependency>
1.2 打包核心代碼java
經過 Apachecompress
工具打包思路大體以下:linux
①:建立一個 FileOutputStream
到輸出文件(.tar.gz)文件。apache
②:建立一個 GZIPOutputStream
,用來包裝 FileOutputStream
對象。工具
③:建立一個 TarArchiveOutputStream
,用來包裝 GZIPOutputStream
對象。測試
④:接着,讀取文件夾中的全部文件。spa
⑤:若是是目錄,則將其添加到 TarArchiveEntry
。code
⑥:若是是文件,依然將其添加到 TarArchiveEntry
中,而後還需將文件內容寫入 TarArchiveOutputStream
中。htm
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); } private static void createTarFile(String sourceFolder, String tarGzPath) { TarArchiveOutputStream tarOs = null; try { // 建立一個 FileOutputStream 到輸出文件(.tar.gz)FileOutputStream fos = new FileOutputStream(tarGzPath); // 建立一個 GZIPOutputStream,用來包裝 FileOutputStream 對象GZIPOutputStream gos = new GZIPOutputStream(new BufferedOutputStream(fos)); // 建立一個 TarArchiveOutputStream,用來包裝 GZIPOutputStream 對象 tarOs = new TarArchiveOutputStream(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 (IOException e) { e.printStackTrace(); } finally { try { tarOs.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void addFilesToTarGZ(String filePath, String parent, TarArchiveOutputStream tarArchive) throws IOException { File file = new File(filePath); // Create entry name relative to parent file pat String entryName = parent + file.getName(); // 添加 tar ArchiveEntry tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName)); if (file.isFile()) { FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); // 寫入文件 IOUtils.copy(bis, tarArchive); tarArchive.closeArchiveEntry(); bis.close(); } else if (file.isDirectory()) { // 由於是個文件夾,無需寫入內容,關閉便可 tarArchive.closeArchiveEntry(); // 讀取文件夾下全部文件 for (File f : file.listFiles()) { // 遞歸 addFilesToTarGZ(f.getAbsolutePath(), entryName + File.separator, tarArchive); } } } public static void main(String[] args) throws IOException { // 測試一波,將 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"); }}