【Java】使用jdk自帶的zip壓縮實現任意文件壓縮打包下載功能(復制即用)

前言

? ?在實際項目中,我們可能會接到將文件或者資料打包壓縮導出的需求,例如將系統中某些生成的文件一起打包壓縮下載提供給客戶使用,今天提供一個jdk自帶的工具類快速實現打包壓縮的功能,方法我已經封裝好,大家如果在項目中遇到類似需求可以直接復制過去使用

一、思路和步驟

??首先將我們在系統上生成的文件或者服務器上現有的文件讀取到輸出流中,然后傳給zip壓縮流實現壓縮并響應到瀏覽器下載

具體步驟:

1、將文件轉換為流
2、將生成好的文件流數據和文件名(壓縮包內一個文件對應一個文件名)封裝
3、將數據添加到壓縮流中進行壓縮
4、響應到瀏覽器下載
5、關閉流

二、工具類封裝

??下面是一個工具類封裝和具體實現
1、封裝一個數據實體

import lombok.AllArgsConstructor;
import lombok.Data;/*** @Author: 你住過的屋檐* @Date: 2025/2/26 下午5:34* @aphorism You are lucky to have someone to help you.No one to help you, is just fate.No one should do anything for you, because life is your own, you are responsible for yourself*/
@Data
@AllArgsConstructor
public class FileData {/*** 文件名*/private String fileName;/*** 文件流字節數組*/private byte[] fileByte;
}

2、工具類

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** @Author: 你住過的屋檐* @Date: 2025/2/26 下午4:01* @aphorism You are lucky to have someone to help you.No one to help you, is just fate.No one should do anything for you, because life is your own, you are responsible for yourself*/
public class ZipUtils {/*** 壓縮文件并下載* @param zipName 壓縮包名稱* @param fileDataList 壓縮數據流* @param response 響應對象* @throws IOException*/public static void downLoadZip(String zipName, List<FileData> fileDataList, HttpServletResponse response) throws IOException {if(fileDataList==null||fileDataList.isEmpty()){throw new IOException("數據為空");}ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream();ZipOutputStream zos = new ZipOutputStream(zipOutputStream);for (FileData fileData : fileDataList) {// 添加文件到 ZIP件中addFileToZip(zos, fileData.getFileName(), fileData.getFileByte());}// finish()方法用于完成當前 ZIP 文件的寫入。它會寫入 ZIP 文件的結束記錄,確保 ZIP 文件的完整性zos.finish();//關閉 ZipOutputStream,釋放資源zos.close();// 創建輸入流資源ByteArrayInputStream in = new ByteArrayInputStream(zipOutputStream.toByteArray());// 設置響應頭,通知瀏覽器下載response.setContentType("application/force-download");String fileName= URLEncoder.encode(zipName,"utf-8");response.setHeader("Content-disposition", "attachment; filename="+fileName );response.setContentLength(in.available());OutputStream out = response.getOutputStream();byte[] b= new byte[1024];int len;while((len=in.read(b))!=-1){out.write(b,0,len);}//用于強制將緩沖區中的數據立即寫入到目標輸出流中,避免數據丟失。out.flush();//關閉輸出流并釋放資源out.close();//關閉輸入流并釋放資源in.close();}/*** 添加文件到 ZIP 文件中* @param zipOut* @param fileName 文件名* @param content 添加內容* @throws IOException*/private static  void addFileToZip(ZipOutputStream zipOut, String fileName, byte[] content) throws IOException {ZipEntry zipEntry = new ZipEntry(fileName);zipOut.putNextEntry(zipEntry);zipOut.write(content);zipOut.closeEntry();}
}

三、實現效果

下面是演示效果
1、在D盤創建了一個文檔,寫一個hello world!
在這里插入圖片描述
2、寫一個調用接口

import com.customs.broker.utils.zip.FileData;
import com.customs.broker.utils.zip.ZipUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;@RestController
public class TestController {@GetMapping("/download")public void downLoadZip(HttpServletResponse response){try {File file = new File("D:\\測試文檔.txt");//轉換為輸入流FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//讀取文件到輸出流中byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}List<FileData> fileDataList = new ArrayList<>();//將文件流和文件名封裝進實體FileData fileData = new FileData("測試文檔.txt", outputStream.toByteArray());//添加fileDataList.add(fileData);//執行壓縮打包下載ZipUtils.downLoadZip("test.zip",fileDataList,response);} catch (IOException e) {e.printStackTrace();}}}

3、啟動項目后瀏覽器執行調用接口

http://127.0.0.1:8080/download

直接生成了壓縮包并且下載到了瀏覽器
![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/6648954e3e74475da79d0eb373fe0695.png

打包壓縮包已經將hello world!的文檔壓縮進壓縮包
在這里插入圖片描述

為了幫助更多像你一樣的讀者,我將持續在專欄中分享技術干貨和實用技巧。如果你覺得這篇文章對你有幫助,可以考慮關注我的專欄,謝謝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72258.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊云擴容記錄

騰訊云擴容&#xff1a; sudo yum install -y cloud-utils-growpart 安裝擴容工具 sudo file -s /dev/vda1 有數據 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完畢 以下是對執行的命令的詳細解釋以及背后的原理&#xff1a; 1. 安裝 cloud…

服務流程設計和服務或端口重定向及其websocket等應用示例

服務流程設計和服務或端口重定向及其websocket等應用示例 目錄 服務或端口重定向的服務設計和websocket等應用示例 一、通用請求控制流程 1.1、入口 1.2、所有GET請求首先預檢控制單元 1.3、http請求會分別自動307重定向 1.4、所有請求首先執行跨源控制單元 1.5、然后…

PHP面試題--后端部分

本文章持續更新內容 之前沒來得及整理時間問題導致每次都得找和重新背 這次整理下也方便各位小伙伴一起更輕松的一起踏入編程之路 歡迎各位關注博主不定期更新各種高質量內容適合小白及其初級水平同學一起學習 一起成為大佬 數組函數有那些 ps&#xff1a;本題挑難的背因為…

深入了解 MySQL 中的 JSON_CONTAINS

深入了解 MySQL 中的 JSON_CONTAINS MySQL 5.7 及更高版本引入了對 JSON 數據類型的支持&#xff0c;使得在數據庫中存儲和查詢 JSON 數據成為可能。在這些新功能中&#xff0c;JSON_CONTAINS 函數是一個非常有用的工具&#xff0c;允許我們檢查一個 JSON 文檔是否包含特定的值…

git命令學習記錄

1. git reset 參數說明 git reset 是用來回退版本的&#xff0c;它可以添加三個參數&#xff0c;常用的使用格式是這樣的&#xff1a;git reset [--hard | --soft | --mixed] 版本號 一般使用git修改文件并提交需要三步&#xff0c;第一步在文本編輯器中編輯文件&#xff0c;也…

使用DeepSeek+KIMI生成高質量PPT

一、使用DeepSeek DeepSeek官網&#xff1a;DeepSeek 點擊“開始對話”&#xff0c;進入交互頁面。 在上圖中&#xff0c;輸入問題&#xff0c;即可獲取AI生成的結果。 基礎模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…

深度學習工程師的技術圖譜和學習路徑

在構建一個深度學習工程師的技術圖譜時,按照“技能樹與能力模型”的結構可以幫助清晰地展示出技術體系的層次化關系,幫助學習者更好地理解每個技術點的依賴與順序。 深度學習工程師的技術圖譜和學習路徑 以下是深度學習工程師的技能樹,包括從基礎到進階的學習路徑,以及對…

RabbitMQ系列(五)基本概念之Queue

在 RabbitMQ 中&#xff0c;Queue&#xff08;隊列&#xff09; 是存儲消息的容器&#xff0c;也是消息傳遞的核心載體。以下是其核心特性與作用的全方位解析&#xff1a; 一、Queue 的定義與核心作用 消息存儲容器 Queue 是 RabbitMQ 中實際存儲消息的實體&#xff0c;生產者…

MySQL—使用binlog日志恢復數據

一、binlog日志恢復數據簡介 在 MySQL 中&#xff0c;使用二進制日志&#xff08;binlog&#xff09;恢復數據是一種常見的用于故障恢復或數據找回的方法。以下是詳細的使用步驟&#xff1a; 確認 binlog 已啟用&#xff1a;首先需要確認 MySQL 服務器已經啟用了二進制日志功…

VADv2: 基于矢量表征和概率規劃的E2E架構

1. 寫在前面 今天分享一篇自動駕駛領域的論文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率規劃的E2E架構,2024年2月份華中科技大和地平線合作的一篇文章, 在經典的端到端模型架構上作出了基于概率規劃去輸出規劃軌跡的…

NLP11-命名實體識別(NER)概述

目錄 一、序列標注任務 常見子任務 二、 命名實體識別&#xff08;NER&#xff09; &#xff08;一&#xff09;簡介 &#xff08;二&#xff09;目標 &#xff08;三&#xff09;應用場景 &#xff08;四&#xff09;基本方法 &#xff08;五&#xff09;工具與資源 一…

虛擬仿真無線路由器5G和2.4G發射信號輻射對比(虛擬仿真得出最小安全距離,與國際標準要求一致)

1、前言 有人說&#xff0c;只要有電磁波的地方就有輻射。5G和2.4G信號輻射強度是多少&#xff1f;是否會對人體構成危害&#xff1f;無線路由器的2.4GHz頻段&#xff0c;頻率范圍&#xff1a;2.4 GHz 至 2.4835 GHz&#xff0c;信道寬度&#xff1a;通常為20 MHz&#xff0c;…

深入剖析 OpenCV:全面掌握基礎操作、圖像處理算法與特征匹配

深入剖析 OpenCV&#xff1a;全面掌握基礎操作、圖像處理算法與特征匹配 一、引言二、OpenCV 的安裝&#xff08;一&#xff09;使用 pip 安裝&#xff08;二&#xff09;使用 Anaconda 安裝 三、OpenCV 基礎操作&#xff08;一&#xff09;圖像的讀取、顯示與保存&#xff08;…

DOM HTML:深入理解與高效運用

DOM HTML:深入理解與高效運用 引言 隨著互聯網的飛速發展,前端技術逐漸成為軟件開發中的關鍵部分。DOM(文檔對象模型)和HTML(超文本標記語言)是前端開發中的基石。本文將深入探討DOM和HTML的概念、特性以及在實際開發中的應用,幫助讀者更好地理解和使用這兩項技術。 …

【數據挖掘】Matplotlib

Matplotlib 是 Python 最常用的 數據可視化 庫之一&#xff0c;在數據挖掘過程中&#xff0c;主要用于 數據探索 (EDA)、趨勢分析、模式識別 和 結果展示。 &#x1f4cc; 1. Matplotlib 基礎 1.1 安裝 & 導入 # 如果未安裝 Matplotlib&#xff0c;請先安裝 # pip instal…

DHCP配置實驗

實驗拓撲圖 首先配置server的IP地址和網關 接下來配置R1 undo info-center enable dhcp enable //開啟DHCP服務 ip pool dhcp-pool1 //開始配置dhcp地址池 gateway-list 192.168.1.254 //配置網關 network 192.168.1.0 mask 255.255.255.0 //配置網段和子網掩碼 dns-list …

Linux:ELF文件-靜動態庫原理

??所屬專欄&#xff1a;Linux?? ??作者主頁&#xff1a;嶔某?? ELF文件 什么是編譯&#xff1f;編譯就是將程序源代碼編譯成能讓CPU直接執行的機器代碼 如果我們要編譯一個 .c文件&#xff0c;使用gcc -c將.c文件編譯為二進制文件.o &#xff0c;如果一個項目有多個.…

C++性能優化常用技巧

一. 選擇合適的數據結構 1.1 map與unordered_map的選擇 如果僅僅只需要使用到快速查找的特性&#xff0c;那么unordered_map更加合適&#xff0c;他的復雜度是O(1)。如果還需要排序以及范圍查找的能力&#xff0c;那么就選擇map。 1.2 vector與list的選擇 通常情況下&#…

Towards Graph Foundation Models: A Survey and Beyond

Towards Graph Foundation Models: A Survey and Beyond WWW24 ?#paper/???#? #paper/&#x1f4a1;#? 背景和動機 背景與意義 隨著基礎模型&#xff08;如大語言模型&#xff09;在NLP等領域的突破&#xff0c;圖機器學習正經歷從淺層方法向深度學習的范式轉變。GFM…

基于 Python 深度學習的電影評論情感分析可視化系統(2.0 全新升級)

基于 Python 深度學習的電影評論情感分析可視化系統&#xff0c;基于 Flask 深度學習&#xff0c;構建了一個 影評情感分析系統&#xff0c;能夠 自動分析影評、計算情感趨勢 并 可視化展示&#xff0c;對于電影行業具有重要參考價值&#xff01; 基于 Python 深度學習的電影評…