java實現(xiàn)zip,gzip,7z,zlib格式的壓縮打包
本文主要介紹的是通過使用java的相關(guān)類可以實現(xiàn)對文件或文件夾的壓縮。
zlib是一種數(shù)據(jù)壓縮程序庫,它的設(shè)計目標(biāo)是處理單純的數(shù)據(jù)(而不管數(shù)據(jù)的來源是什么)。
7z 是一種新的壓縮格式,它擁有目前最高的壓縮比。
gzip是一種文件壓縮工具(或該壓縮工具產(chǎn)生的壓縮文件格式),它的設(shè)計目標(biāo)是處理單個的文件。gzip在壓縮文件中的數(shù)據(jù)時使用的就是zlib。為了保存與文件屬性有關(guān)的信息,gzip需要在壓縮文件(*.gz)中保存更多的頭信息內(nèi)容,而zlib不用考慮這一點。但gzip只適用于單個文件,所以我們在UNIX/Linux上經(jīng)常看到的壓縮包后綴都是*.tar.gz或*.tgz,也就是先用tar把多個文件打包成單個文件,再用gzip壓縮的結(jié)果。
zip是適用于壓縮多個文件的格式(相應(yīng)的工具有PkZip和WinZip等),因此,zip文件還要進(jìn)一步包含文件目錄結(jié)構(gòu)的信息,比gzip的頭信息更多。但需要注意,zip格式可采用多種壓縮算法,我們常見的zip文件大多不是用zlib的算法壓縮的,其壓縮數(shù)據(jù)的格式與gzip大不一樣。
所以,你應(yīng)當(dāng)根據(jù)你的具體需求,選擇不同的壓縮技術(shù):如果只需要壓縮/解壓縮數(shù)據(jù),你可以直接用zlib實現(xiàn),如果需要生成gzip格式的文件或解壓其他工具的壓縮結(jié)果,你就必須用gzip或zip等相關(guān)的類來處理了。
maven依賴
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.12</version>
</dependency>
zip格式
public static void zip(String input, String output, String name) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(output));
String[] paths = input.split("\\|");
File[] files = new File[paths.length];
byte[] buffer = new byte[1024];
for (int i = 0; i < paths.length; i++) {
files[i] = new File(paths[i]);
}
for (int i = 0; i < files.length; i++) {
FileInputStream fis = new FileInputStream(files[i]);
if (files.length == 1 && name != null) {
out.putNextEntry(new ZipEntry(name));
} else {
out.putNextEntry(new ZipEntry(files[i].getName()));
}
int len;
// 讀入需要下載的文件的內(nèi)容,打包到zip文件
while ((len = fis.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.closeEntry();
fis.close();
}
out.close();
}
gzip打包
public static void gzip(String input, String output, String name) throws Exception {
String compress_name = null;
if (name != null) {
compress_name = name;
} else {
compress_name = new File(input).getName();
}
byte[] buffer = new byte[1024];
try {
GzipParameters gp = new GzipParameters(); //設(shè)置壓縮文件里的文件名
gp.setFilename(compress_name);
GzipCompressorOutputStream gcos = new GzipCompressorOutputStream(new FileOutputStream(output), gp);
FileInputStream fis = new FileInputStream(input);
int length;
while ((length = fis.read(buffer)) > 0) {
gcos.write(buffer, 0, length);
}
fis.close();
gcos.finish();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
7z打包
public static void z7z(String input, String output, String name) throws Exception {
try {
SevenZOutputFile sevenZOutput = new SevenZOutputFile(new File(output));
SevenZArchiveEntry entry = null;
String[] paths = input.split("\\|");
File[] files = new File[paths.length];
for (int i = 0; i < paths.length; i++) {
files[i] = new File(paths[i].trim());
}
for (int i = 0; i < files.length; i++) {
BufferedInputStream instream = null;
instream = new BufferedInputStream(new FileInputStream(paths[i]));
if (name != null) {
entry = sevenZOutput.createArchiveEntry(new File(paths[i]), name);
} else {
entry = sevenZOutput.createArchiveEntry(new File(paths[i]), new File(paths[i]).getName());
}
sevenZOutput.putArchiveEntry(entry);
byte[] buffer = new byte[1024];
int len;
while ((len = instream.read(buffer)) > 0) {
sevenZOutput.write(buffer, 0, len);
}
instream.close();
sevenZOutput.closeArchiveEntry();
}
sevenZOutput.close();
} catch (IOException ioe) {
System.out.println(ioe.toString() + " " + input);
}
}
zlib打包
public static void zlib(String input, String output) throws Exception {
// DeflaterOutputStream dos = new DeflaterOutputStream(new FileOutputStream(output));
DeflateParameters dp = new DeflateParameters();
dp.setWithZlibHeader(true);
DeflateCompressorOutputStream dcos = new DeflateCompressorOutputStream(new FileOutputStream(output),dp);
FileInputStream fis = new FileInputStream(input);
int length = (int) new File(input).length();
byte data[] = new byte[length];
// int length;
while ((length = fis.read(data)) > 0) {
dcos.write(data, 0, length);
}
fis.close();
dcos.finish();
dcos.close();
}
希望本文所述對你有所幫助,java實現(xiàn)zip,gzip,7z,zlib格式的壓縮打包內(nèi)容就給大家介紹到這里了。希望大家繼續(xù)關(guān)注我們的網(wǎng)站!想要學(xué)習(xí)java可以繼續(xù)關(guān)注本站。
相關(guān)文章
SpringBoot實現(xiàn)前端驗證碼圖片生成和校驗
這篇文章主要為大家詳細(xì)介紹了SpringBoot實現(xiàn)前端驗證碼圖片生成和校驗,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
Java8新特性之類型注解_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java8新特性之類型注解的相關(guān)資料,需要的朋友可以參考下2017-06-06
Spring中的NamespaceHandler與BeanDefinitionParser詳解
這篇文章主要介紹了Spring中的NamespaceHandler與BeanDefinitionParser詳解,由Spring啟動過程之obtainFreshBeanFactory() ,可以看到NamespaceHandler、BeanDefinitionParser為解析配置文件中的Element起重要作用,那么它本身是如何被加載的呢,需要的朋友可以參考下2023-12-12
SpringBoot實現(xiàn)HTTP服務(wù)監(jiān)聽的代碼示例
前后端分離項目中,在調(diào)用接口調(diào)試時候,我們可以通過cpolar內(nèi)網(wǎng)穿透將本地服務(wù)端接口模擬公共網(wǎng)絡(luò)環(huán)境遠(yuǎn)程調(diào)用調(diào)試,本次教程我們以Java服務(wù)端接口為例,需要的朋友可以參考下2023-05-05
詳解Java中Checked Exception與Runtime Exception 的區(qū)別
這篇文章主要介紹了詳解Java中Checked Exception與Runtime Exception 的區(qū)別的相關(guān)資料,這里提供實例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
java發(fā)送http請求時如何處理異步回調(diào)結(jié)果
這篇文章主要介紹了java發(fā)送http請求時如何處理異步回調(diào)結(jié)果問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
詳解SpringBoot啟動項目后執(zhí)行方法的幾種方式
在項目開發(fā)中某些場景必須要用到啟動項目后立即執(zhí)行方式的功能,本文主要聊聊實現(xiàn)立即執(zhí)行的幾種方法,具有一定的參考價值,感興趣的可以了解一下2023-09-09

