Java實(shí)現(xiàn)文件壓縮為zip和解壓zip壓縮包
壓縮成.zip
代碼如下:
/**
* 壓縮成ZIP
*
* @param srcDir 壓縮文件夾路徑
* @param out 壓縮文件輸出流
* @throws RuntimeException 壓縮失敗會(huì)拋出運(yùn)行時(shí)異常
*/
public static void toZip(String srcDir, OutputStream out) throws RuntimeException {
long start = System.currentTimeMillis();
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
File sourceFile = new File(srcDir);
compress(sourceFile, zos, sourceFile.getName(), false);
long end = System.currentTimeMillis();
System.out.println("壓縮完成,耗時(shí):" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 遞歸壓縮方法
*
* @param sourceFile 源文件
* @param zos zip輸出流
* @param name 壓縮后的名稱(chēng)
* @param KeepDirStructure 是否保留原來(lái)的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu);
* <p>
* false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)
* @throws Exception
*/
private 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);
}
// Complete the entry
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);
}
}
}
}
}
測(cè)試驗(yàn)證代碼:
/**
* 測(cè)試打包本地的Navicat,輸出為zip文件
* @throws Exception
*/
@Test
public void test() throws Exception {
//Navicat路徑
String inDir = "E:\\developer\\Navicat";
//打包后輸出路徑
String outDir = "E:\\developer\\NavicatZip\\Navicat.zip";
OutputStream fileOutputStream = new FileOutputStream(new File(outDir));
ZipUtils.toZip(inDir, fileOutputStream);
}
打包前后的文件如下:


解壓.zip
代碼如下:
/**
* 解壓zip文件到指定目錄
* @param fileZip
* @param path_to_dest
* @throws IOException
*/
public static void readZip(String fileZip,String path_to_dest) throws IOException {
try (FileInputStream fis = new FileInputStream(fileZip);
ZipInputStream zis =
new ZipInputStream(new BufferedInputStream(fis))) {
ZipEntry entry;
// 從ZipInputStream讀取每個(gè)條目,直到?jīng)]有
// 發(fā)現(xiàn)更多條目,返回值為空
// getNextEntry()方法。
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Unzipping: " + entry.getName());
int size;
byte[] buffer = new byte[2048];
File fileOut = new File(path_to_dest+"\\"+entry.getName());
try (FileOutputStream fos =
new FileOutputStream(fileOut);
BufferedOutputStream bos =
new BufferedOutputStream(fos, buffer.length)) {
while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, size);
}
bos.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
測(cè)試驗(yàn)證代碼:
/**
* 測(cè)試解壓本地zip文件
* @throws Exception
*/
@Test
public void readZip() throws Exception {
//解壓后路徑
String path_to_dest = "E:\\developer\\NavicatUnzip";
//zip文件路徑
String fileZip = "E:\\developer\\NavicatZip\\Navicat.zip";
ZipUtils.readZip(fileZip, path_to_dest);
}
解壓前后的文件如下:


以上就是Java實(shí)現(xiàn)文件壓縮為zip和解壓zip壓縮包的詳細(xì)內(nèi)容,更多關(guān)于Java文件壓縮為zip的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- java壓縮zip文件中文亂碼問(wèn)題解決方法
- java使用gzip實(shí)現(xiàn)文件解壓縮示例
- Java解壓和壓縮帶密碼的zip文件過(guò)程詳解
- Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí))
- Java后臺(tái)實(shí)現(xiàn)瀏覽器一鍵導(dǎo)出下載zip壓縮包
- Java多文件以ZIP壓縮包導(dǎo)出的實(shí)現(xiàn)方法
- 用Java進(jìn)行zip文件壓縮與解壓縮
- Java實(shí)現(xiàn)導(dǎo)出ZIP壓縮包的方法
- java實(shí)現(xiàn)一次性壓縮多個(gè)文件到zip中的方法示例
- Java創(chuàng)建ZIP壓縮文件的方法
- 淺談Java?Zip?壓縮及其優(yōu)化
相關(guān)文章
SpringBoot實(shí)現(xiàn)文件下載功能的方式分享
這篇文章主要為大家詳細(xì)介紹了SpringBoot這哪個(gè)實(shí)現(xiàn)文件下載功能的幾種方式,文中的實(shí)現(xiàn)方法簡(jiǎn)介易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
SpringBoot整合liteflow的詳細(xì)過(guò)程
這篇文章主要介紹了SpringBoot整合liteflow的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-06-06
使用JPA支持多參數(shù)列表查詢(xún)(參數(shù)可能為空)
這篇文章主要介紹了使用JPA支持多參數(shù)列表查詢(xún)(參數(shù)可能為空),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線(xiàn)支付平臺(tái)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第20戰(zhàn)之在線(xiàn)支付平臺(tái),關(guān)于第三方支付的內(nèi)容從本文開(kāi)始,感興趣的小伙伴們可以參考一下2016-06-06
Java利用happen-before規(guī)則如何實(shí)現(xiàn)共享變量的同步操作詳解
這篇文章主要給大家介紹了關(guān)于Java利用happen-before規(guī)則實(shí)現(xiàn)共享變量的同步操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
idea maven 項(xiàng)目src下的配置文件沒(méi)有同步至target的解決操作
這篇文章主要介紹了idea maven 項(xiàng)目src下的配置文件沒(méi)有同步至target的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Java方法遞歸的形式和常見(jiàn)遞歸算法(方法遞歸結(jié)合File類(lèi)查找文件)
方法遞歸方法直接調(diào)用自己或者間接調(diào)用自己的形式稱(chēng)為方法遞歸( recursion),遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用,這篇文章主要介紹了Java方法遞歸的形式和常見(jiàn)遞歸算法-方法遞歸結(jié)合File類(lèi)查找文件,需要的朋友可以參考下2023-02-02
基于Java實(shí)現(xiàn)音樂(lè)播放器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫(xiě)一個(gè)簡(jiǎn)單的音樂(lè)播放器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07
Java Spring循環(huán)依賴(lài)原理與bean的生命周期圖文案例詳解
這篇文章主要介紹了Spring循環(huán)依賴(lài)原理與bean的生命周期圖文案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

