java ZipFile如何將多級(jí)目錄壓縮
java ZipFile將多級(jí)目錄壓縮
在 Java 中,可以使用 java.util.zip 包中的 ZipOutputStream 和 ZipEntry 類(lèi)來(lái)壓縮多級(jí)目錄。
一個(gè)例子
展示如何遞歸地將一個(gè)目錄及其所有子目錄和文件壓縮到一個(gè) ZIP 文件中:
import java.io.*;
import java.nio.file.*;
import java.util.zip.*;
public class ZipDirectory {
public static void main(String[] args) throws IOException {
String sourceDirPath = "path/to/source/directory";
String zipFilePath = "path/to/output.zip";
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
Path sourceDir = Paths.get(sourceDirPath);
Files.walk(sourceDir)
.filter(path -> !Files.isDirectory(path))
.forEach(path -> {
ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString());
try {
zipOut.putNextEntry(zipEntry);
Files.copy(path, zipOut);
zipOut.closeEntry();
} catch (IOException e) {
System.err.println("Failed to add file to ZIP: " + path);
e.printStackTrace();
}
});
}
}
}這個(gè)程序?qū)⒈闅v指定目錄(包括子目錄)的所有文件,并將它們添加到 ZIP 文件中。
步驟解析
- 使用 Files.walk 方法遞歸遍歷源目錄。
- 對(duì)于每個(gè)非目錄文件,創(chuàng)建一個(gè)相對(duì)路徑的 ZipEntry。
- 將文件內(nèi)容復(fù)制到 ZipOutputStream。
請(qǐng)根據(jù)實(shí)際情況替換 sourceDirPath 和 zipFilePath。此外,請(qǐng)確保適當(dāng)處理異常并關(guān)閉資源以避免資源泄漏。
Java多級(jí)目錄導(dǎo)出文件壓縮包
//創(chuàng)建臨時(shí)文件
File zipFile = File.createTempFile("test", ".zip");
Path temp = Files.createTempDirectory(null);
String srcImgPath = temp.toString();
for( 循環(huán) ){
String outImgPath = srcImgPath + "/aa/bb/cc";
File outImgFile = new File(outImgPath);
//如果文件夾不存在則創(chuàng)建
if (!outImgFile.exists() && !outImgFile.isDirectory()) {
outImgFile.mkdirs();
}
FileOutputStream outImgStream = new FileOutputStream(outImgPath + "/" + name);
ImageIO.write(bufImg, imgSuffix, outImgStream);
outImgStream.flush();
outImgStream.close();
}
ZipUtil.zip(srcImgPath, zipFile.getAbsolutePath(), true);
String header = request.getHeader("User-Agent").toUpperCase();
String fileName = "附件信息" + System.currentTimeMillis() + ".zip";
if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
fileName = URLEncoder.encode(fileName, "utf-8");
//IE下載文件名空格變+號(hào)問(wèn)題
fileName = fileName.replace("+", "%20");
} else {
fileName = new String(fileName.getBytes(), "ISO8859-1");
}
response.reset();
response.setContentType("text/plain");
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Location", fileName);
response.setHeader("Cache-Control", "max-age=0");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
FileInputStream fis = new FileInputStream(zipFile);
BufferedInputStream buff = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
byte[] car = new byte[1024];
int l = 0;
while (l < zipFile.length()) {
int j = buff.read(car, 0, 1024);
l += j;
out.write(car, 0, j);
}
// 關(guān)閉流
fis.close();
buff.close();
out.close();
// 刪除臨時(shí)文件
zipFile.delete();
FileUtil.deleteDir(srcImgPath);總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多態(tài)中動(dòng)態(tài)綁定原理解析
這篇文章主要介紹了Java多態(tài)中動(dòng)態(tài)綁定原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
SpringBoot通過(guò)token實(shí)現(xiàn)用戶互踢功能(具體實(shí)現(xiàn))
所謂token,既用戶能夠在一定時(shí)間內(nèi)證明自己身份的一長(zhǎng)串字符串,這篇文章主要介紹了SpringBoot通過(guò)token實(shí)現(xiàn)用戶互踢功能,需要的朋友可以參考下2024-04-04
Spring IOC 能降低耦合的問(wèn)題分析及解決方法
這篇文章主要介紹了Spring IOC 為什么能降低耦合,依賴注入是調(diào)用者僅通過(guò)聲明某個(gè)組件就可以獲得組件的控制權(quán),而對(duì)該組件的依賴關(guān)系管理、查找、加載由外部完成,需要的朋友可以參考下2022-06-06
Java編程倒計(jì)時(shí)實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java編程倒計(jì)時(shí)實(shí)現(xiàn)的三個(gè)示例,三種實(shí)現(xiàn)方法,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException的錯(cuò)誤問(wèn)題
這篇文章主要介紹了IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException問(wèn)題 ,本文內(nèi)容簡(jiǎn)短給大家介紹的好,需要的朋友可以參考下2020-05-05
Mybatis調(diào)用SQL?Server存儲(chǔ)過(guò)程的實(shí)現(xiàn)示例
在軟件開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)使用到存儲(chǔ)過(guò)程,本文就來(lái)介紹一下Mybatis調(diào)用SQL?Server存儲(chǔ)過(guò)程的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
這篇文章主要介紹了詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

