最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用ZipOutputStream進行高效壓縮的技巧詳解

 更新時間:2025年07月07日 08:14:35   作者:心之語歌  
ZipOutputStream 是 Java 標準庫中用于 創(chuàng)建 ZIP 文件 的核心類,位于 java.util.zip 包中,本文主要和大家介紹了Java如何使用ZipOutputStream進行高效壓縮,有需要的可以了解下

簡介

ZipOutputStream 是 Java 標準庫中用于 創(chuàng)建 ZIP 文件 的核心類,位于 java.util.zip 包中。它允許你將多個文件或字節(jié)流寫入一個 ZIP 壓縮包,并支持設置壓縮級別、編碼方式等參數(shù)。

基本概念

ZipOutputStream的作用

  • 將多個文件(或字節(jié)數(shù)組)打包成一個 ZIP 文件。
  • 支持添加多個條目(ZipEntry),每個條目代表 ZIP 中的一個文件。
  • 可控制壓縮級別、編碼格式、注釋等。

常用方法說明

方法描述
putNextEntry(ZipEntry entry)開始寫入一個新的 ZIP 條目(文件)
closeEntry()關閉當前 ZIP 條目,準備寫入下一個
write(byte[] b, int off, int len)寫入當前條目的內容(字節(jié)數(shù)據(jù))
setLevel(int level)設置壓縮級別(0~9)
setComment(String comment)設置整個 ZIP 文件的注釋
finish()完成寫入,但不關閉底層輸出流(可選)

可選的壓縮級別(取值范圍:0 ~ 9)

級別含義特點
Deflater.NO_COMPRESSION (0)不壓縮速度最快,ZIP 文件最大
Deflater.BEST_SPEED (1)最快壓縮壓縮率低,速度快
Deflater.DEFAULT_COMPRESSION (6)默認壓縮平衡壓縮率與速度
Deflater.BEST_COMPRESSION (9)最佳壓縮壓縮率最高,速度最慢

本地保存

import java.io.*;
import java.nio.file.*;
import java.util.zip.*;

public class ZipDemo {
    public static void main(String[] args) throws IOException {
        // 源文件夾路徑:要壓縮的文件所在的目錄
        String sourceDir = "path/to/folder";

        // 輸出 ZIP 文件路徑:生成的壓縮包保存的位置和名稱
        String zipFilePath = "output.zip";

        // 使用 try-with-resources 自動關閉資源(FileOutputStream 和 ZipOutputStream)
        try (FileOutputStream fos = new FileOutputStream(zipFilePath);
             ZipOutputStream zos = new ZipOutputStream(fos)) {

            // 設置 ZIP 壓縮級別為最佳壓縮(壓縮率最高,但速度較慢)
            zos.setLevel(Deflater.BEST_COMPRESSION);

            // 遍歷源目錄下的所有文件(包括子目錄中的文件)
            Files.walk(Paths.get(sourceDir))
                 // 過濾掉目錄,只保留文件
                 .filter(path -> !Files.isDirectory(path))
                 // 對每個文件執(zhí)行以下操作
                 .forEach(path -> {
                     try {
                         // 構建相對路徑字符串:sourceDir + 文件分隔符 + 文件名
                         // 注意:這會導致 ZIP 中的路徑包含 sourceDir 的前綴
                         String relativePath = sourceDir + File.separator + path.getFileName();

                         // 創(chuàng)建一個 ZIP 條目(即 ZIP 包中的一個文件)
                         ZipEntry zipEntry = new ZipEntry(relativePath);

                         // 開始寫入該條目到 ZIP 流中
                         zos.putNextEntry(zipEntry);

                         // 讀取文件內容為字節(jié)數(shù)組
                         byte[] bytes = Files.readAllBytes(path);

                         // 將文件內容寫入 ZIP 輸出流
                         zos.write(bytes, 0, bytes.length);

                         // 關閉當前 ZIP 條目,準備寫入下一個文件
                         zos.closeEntry();

                     } catch (IOException e) {
                         // 如果寫入失敗,打印錯誤信息并輸出異常堆棧
                         System.err.println("寫入 ZIP 失敗: " + path);
                         e.printStackTrace();
                     }
                 });
        }
        // try-with-resources 會自動關閉 fos 和 zos,無需手動 close()
    }
}

ZIP 文件網絡流下載

response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"streamed_files.zip\"");

try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8)) {
    zipOut.setLevel(Deflater.BEST_SPEED);

    for (User u : userList) {
        String fileName = String.format("%sxxxx.docx", u.getNickName());

        try {
            zipOut.putNextEntry(new ZipEntry(fileName));
            byte[] docBytes = genDocx(u).toByteArray();
            zipOut.write(docBytes, 0, docBytes.length);
            zipOut.closeEntry();
        } catch (IOException e) {
            log.error("寫入 ZIP 條目失敗: {}", fileName, e);
            throw new IOException("生成 ZIP 條目時出錯: " + fileName, e);
        }
    }

} catch (IOException ex) {
    log.error("導出 ZIP 異常", ex);
    throw new RuntimeException("導出異常");
}

1. 設置響應頭

response.setContentType("application/zip");
  • 設置 HTTP 響應內容類型為 application/zip,告訴瀏覽器這是一個 ZIP 文件。
  • 瀏覽器收到后會識別為壓縮文件,通常會觸發(fā)下載行為。
response.setHeader("Content-Disposition", "attachment; filename=\"streamed_files.zip\"");
  • 設置響應頭 Content-Disposition,值為 attachment 表示讓瀏覽器不要在頁面中顯示該內容,而是提示用戶下載。
  • filename="streamed_files.zip" 指定下載時的默認文件名。

2. 創(chuàng)建 ZIP 輸出流(使用 try-with-resources)

try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8)) {
  • 使用 try-with-resources 自動關閉資源,確保最后流會被正確關閉。
  • 創(chuàng)建了一個 ZipOutputStream,它是一個用于寫入 ZIP 文件格式的輸出流。
  • 第二個參數(shù) StandardCharsets.UTF_8 是為了支持中文文件名編碼(避免解壓時出現(xiàn)亂碼)。

注意:部分舊系統(tǒng)或工具(如 Windows 自帶解壓器)可能不識別 UTF-8 編碼的 ZIP 文件名,建議使用 7-Zip、WinRAR 或 Mac 解壓工具。

3. 設置壓縮級別(可選)

zipOut.setLevel(Deflater.BEST_SPEED);
  • 設置壓縮級別為最快壓縮模式。
  • 這樣可以減少服務器 CPU 占用,適合對壓縮率要求不高但希望快速響應用戶的場景。
  • 可替換為:
    • Deflater.DEFAULT_COMPRESSION(默認)
    • Deflater.BEST_COMPRESSION(最佳壓縮)

4. 生成文件加入到 zip 流

zipOut.putNextEntry(new ZipEntry(fileName));
  • 在 ZIP 包中創(chuàng)建一個新的條目(即文件),名字是上面生成的文件名。
  • 每次調用 putNextEntry() 后必須調用 closeEntry() 才能繼續(xù)添加下一個文件。
byte[] docBytes = genDocx(u).toByteArray();
zipOut.write(docBytes, 0, docBytes.length);
  • 調用 genDocx(u) 方法生成當前用戶的 .docx 文件內容(返回的是 ByteArrayOutputStream)。
  • 將其轉為字節(jié)數(shù)組后寫入 ZIP 流中。
zipOut.closeEntry();

關閉當前 ZIP 條目,準備寫入下一個文件。

到此這篇關于Java利用ZipOutputStream進行高效壓縮的技巧詳解的文章就介紹到這了,更多相關Java ZipOutputStream壓縮內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java 分割csv數(shù)據(jù)的實例詳解

    java 分割csv數(shù)據(jù)的實例詳解

    這篇文章主要介紹了java 分割csv數(shù)據(jù)的實例詳解的相關資料,這里提供了簡單實例,需要的朋友可以參考下
    2017-07-07
  • Java實現(xiàn)SHA算法的方法詳解

    Java實現(xiàn)SHA算法的方法詳解

    這篇文章主要介紹了Java實現(xiàn)SHA算法的方法,結合實例形式較為詳細的分析了Java實現(xiàn)sha算法的原理、實現(xiàn)與使用相關操作技巧,需要的朋友可以參考下
    2018-03-03
  • Java8中Stream的詳細使用方法大全

    Java8中Stream的詳細使用方法大全

    Java8的另一大亮點Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關于Java8中Stream詳細使用方法的相關資料,需要的朋友可以參考下
    2022-06-06
  • mybatis-plus分頁查詢total=0問題及解決方案

    mybatis-plus分頁查詢total=0問題及解決方案

    這篇文章主要介紹了mybatis-plus分頁查詢total=0問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Java實現(xiàn)學生信息管理系統(tǒng)超詳細教程

    Java實現(xiàn)學生信息管理系統(tǒng)超詳細教程

    這篇文章主要介紹了一個簡單的Java學生信息管理系統(tǒng),使用ArrayList集合存儲學生對象信息,并實現(xiàn)了添加、刪除、修改和查看學生信息的功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • 遞歸出現(xiàn)棧溢出stackoverflow的問題及解決

    遞歸出現(xiàn)棧溢出stackoverflow的問題及解決

    這篇文章主要介紹了關于遞歸出現(xiàn)棧溢出stackoverflow的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java異步非阻塞編程的幾種方式總結

    Java異步非阻塞編程的幾種方式總結

    這篇文章主要介紹了Java異步非阻塞編程的幾種方式總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 把Java程序打包成jar文件包并執(zhí)行的方法

    把Java程序打包成jar文件包并執(zhí)行的方法

    這篇文章主要介紹了把Java程序打包成jar文件包并執(zhí)行的方法,非常具有實用價值,需要的朋友可以參考下
    2017-10-10
  • Java接口測試之日志框架Logback的具體使用

    Java接口測試之日志框架Logback的具體使用

    本文主要介紹了Java接口測試之日志框架Logback的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 解決MyEclipse出現(xiàn)the user operation is waiting的問題

    解決MyEclipse出現(xiàn)the user operation is waiting的問題

    今天做項目的時候每次修改代碼保存后都會跳出一個框框,然后就有兩個進度條,上面寫the user operation is wating...小編去網上查了查解決了這個問題,下面跟大家分享一下。
    2018-04-04

最新評論

昌吉市| 弋阳县| 襄垣县| 宜都市| 桂平市| 岗巴县| 磐石市| 大埔县| 梁平县| 垫江县| 仙游县| 元谋县| 曲麻莱县| 佳木斯市| 鲁山县| 固始县| 龙江县| 武山县| 象山县| 呼伦贝尔市| 台东县| 神木县| 黄山市| 仲巴县| 顺义区| 灵丘县| 武鸣县| 濮阳市| 崇阳县| 会泽县| 德清县| 和田市| 山东| 安平县| 新昌县| 尤溪县| 康乐县| 聂荣县| 广汉市| 莒南县| 彰化县|