import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
private static final int BUFFER_SIZE = 1024 * 2;
/**
* 壓縮成ZIP 方法1
* @param files 需要壓縮的文件集合
* @param zipFilePath 壓縮文件路徑
* @throws Exception
*/
public static void toZip(List<File> files, String zipFilePath) throws Exception {
ZipOutputStream zos = null;
try {
OutputStream out = new FileOutputStream(new File(zipFilePath));
zos = new ZipOutputStream(out);
for (File file : files) {
byte[] buf = new byte[BUFFER_SIZE];
zos.putNextEntry(new ZipEntry(file.getName()));
FileInputStream in = new FileInputStream(file);
int len;
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (zos != null) {
zos.close();
}
}
}
/**
* 壓縮成ZIP 方法2
* @param fileDirPath 壓縮文件夾路徑
* @param zipFilePath 壓縮文路徑
* @param keepDirStructure 是否保留原來(lái)的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu);false:所有文件跑到壓縮包根目錄下(注意:
* 不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)
* @throws Exception
*/
public static void toZip(String fileDirPath, String zipFilePath, boolean keepDirStructure) throws Exception {
ZipOutputStream zos = null;
try {
OutputStream out = new FileOutputStream(new File(zipFilePath));
zos = new ZipOutputStream(out);
File dirFile = new File(fileDirPath);
compress(dirFile, zos, dirFile.getName(), keepDirStructure);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (zos != null) {
zos.close();
}
}
}
/**
* 遞歸壓縮方法
* @param sourceFile 源文件
* @param zos zip輸出流
* @param name 壓縮后的文件夾/文件名稱
* @param keepDirStructure 是否保留原來(lái)的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu);
* false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)
* @throws Exception
*/
public static void compress(File sourceFile, ZipOutputStream zos, String name, boolean keepDirStructure) throws Exception {
byte[] buf = new byte[BUFFER_SIZE];
if (sourceFile.isFile()) {
//向zip輸出流中添加一個(gè)zip實(shí)體,構(gòu)造器中name為zip實(shí)體的文件的名字
zos.putNextEntry(new ZipEntry(name));
//copy文件到zip輸出流中
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
//需要保留原來(lái)的文件結(jié)構(gòu)時(shí),需要對(duì)空文件夾進(jìn)行處理
if (keepDirStructure) {
//空文件夾的處理
zos.putNextEntry(new ZipEntry(name + "/"));
//沒(méi)有文件,不需要文件的copy
zos.closeEntry();
}
} else {
for (File file : listFiles) {
// 判斷是否需要保留原來(lái)的文件結(jié)構(gòu)
if (keepDirStructure) {
// 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠,不然最后壓縮包中就不能保留原來(lái)的文件結(jié)構(gòu),即:所有文件都跑到壓縮包根目錄下了
compress(file, zos, name + "/" + file.getName(), keepDirStructure);
} else {
compress(file, zos, file.getName(), keepDirStructure);
}
}
}
}
}
}
壓縮文件ZipUtil
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)私痹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人统刮,你說(shuō)我怎么就攤上這事紊遵。” “怎么了侥蒙?”我有些...
- 文/不壞的土叔 我叫張陵暗膜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辉哥,道長(zhǎng)桦山,這世上最難降的妖魔是什么攒射? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮恒水,結(jié)果婚禮上会放,老公的妹妹穿的比我還像新娘。我一直安慰自己钉凌,他們只是感情好咧最,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著御雕,像睡著了一般矢沿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酸纲,一...
- 那天捣鲸,我揣著相機(jī)與錄音,去河邊找鬼闽坡。 笑死栽惶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疾嗅。 我是一名探鬼主播外厂,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼代承!你這毒婦竟也來(lái)了汁蝶?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤论悴,失蹤者是張志新(化名)和其女友劉穎掖棉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體意荤,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡啊片,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玖像。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站捺僻,受9級(jí)特大地震影響乡洼,放射性物質(zhì)發(fā)生泄漏崇裁。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一束昵、第九天 我趴在偏房一處隱蔽的房頂上張望拔稳。 院中可真熱鬧,春花似錦锹雏、人聲如沸巴比。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轻绞。三九已至,卻和暖如春佣耐,著一層夾襖步出監(jiān)牢的瞬間政勃,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓掖鱼,卻偏偏與公主長(zhǎng)得像然走,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戏挡,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- Java對(duì)Zip文件的支持不是很強(qiáng)大芍瑞,有一些需要自己實(shí)現(xiàn)的代碼,我在網(wǎng)上找了很多代碼褐墅,都不能用于生產(chǎn)拆檬,要不就是流沒(méi)...
- 背景 寫(xiě)了一個(gè)基于ZLIB壓縮庫(kù)的小程序,實(shí)現(xiàn)了對(duì)數(shù)據(jù)或是文件的壓縮與解壓縮妥凳。在編程實(shí)現(xiàn)的過(guò)程中竟贯,遇到一些波折,主...
- 原文地址 linux tar壓縮解壓縮文件夾、文件命令詳解 直接先上三個(gè)常用命令 1.壓縮當(dāng)前目錄下文件夾/文件t...
- 1蜘欲、ls/ll列出當(dāng)前目錄下文件(夾) 另外如果加上-R參數(shù),可以同時(shí)遞歸顯示子目錄下的文件和文件夾晌柬,這在有些場(chǎng)景...