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


一、如何通過 Java 打包文件

1.1 添加 Maven 依賴

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.12</version>
</dependency>

 

1.2 打包核心代碼

通過 Apachecompress 工具打包思路大致如下:

  • ①:創建一個 FileOutputStream 到輸出文件(.tar.gz)文件。

  • ②:創建一個 GZIPOutputStream,用來包裝 FileOutputStream對象。

  • ③:創建一個 TarArchiveOutputStream,用來包裝 GZIPOutputStream對象。

  • ④:接着,讀取文件夾中的所有文件。

  • ⑤:如果是目錄,則將其添加到 TarArchiveEntry

  • ⑥:如果是文件,依然將其添加到 TarArchiveEntry 中,然后還需將文件內容寫入 TarArchiveOutputStream 中。

 

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");

}
}


  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM