經過 Java 壓縮文件,打包一個 tar.gz 採集器包

1、如何經過 Java 打包文件

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

  • ⑤:若是是目錄,則將其添加到 TarArchiveEntrycode

  • ⑥:若是是文件,依然將其添加到 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");    }}
相關文章
相關標籤/搜索