一、如何通過 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");
}
}