java ZipFile如何將多級(jí)目錄壓縮
java ZipFile將多級(jí)目錄壓縮
在 Java 中,可以使用 java.util.zip 包中的 ZipOutputStream 和 ZipEntry 類來壓縮多級(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)問題 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)綁定原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot通過token實(shí)現(xiàn)用戶互踢功能(具體實(shí)現(xiàn))
所謂token,既用戶能夠在一定時(shí)間內(nèi)證明自己身份的一長串字符串,這篇文章主要介紹了SpringBoot通過token實(shí)現(xiàn)用戶互踢功能,需要的朋友可以參考下2024-04-04Java編程倒計(jì)時(shí)實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java編程倒計(jì)時(shí)實(shí)現(xiàn)的三個(gè)示例,三種實(shí)現(xiàn)方法,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException的錯(cuò)誤問題
這篇文章主要介紹了IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException問題 ,本文內(nèi)容簡短給大家介紹的好,需要的朋友可以參考下2020-05-05Mybatis調(diào)用SQL?Server存儲(chǔ)過程的實(shí)現(xiàn)示例
在軟件開發(fā)過程中,經(jīng)常會(huì)使用到存儲(chǔ)過程,本文就來介紹一下Mybatis調(diào)用SQL?Server存儲(chǔ)過程的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
這篇文章主要介紹了詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03