如何通過 Java 來完成 zip 文件與 rar 文件的解壓縮?

目錄

一、用到的知識點

二、代碼展示(分解版)

三、代碼展示(整體版)


一、用到的知識點

1.IO流:

????????Input:輸入,通過“輸入流”進行文件的讀取操作

????????Output:輸出,通過“輸出流”進行文件的寫入操作

2.文件操作相關:

????????File類:用于表示文件和目錄的路徑。

????????FileInputStream和FileOutputStream:用于讀取和寫入文件。

3.壓縮文件處理:

????????ZipInputStream:用于讀取 ZIP 壓縮文件的輸入流。

????????ZipEntry:表示 ZIP 壓縮文件中的條目(文件或目錄)。

4.異常處理:

????????FileNotFoundException:當嘗試訪問不存在的文件時拋出。

????????IOException:用于處理輸入輸出操作中的一般性異常。

????????RarException:處理與 RAR 壓縮文件操作相關的特定異常。

5.數據輸入輸出流:

????????InputStream:用于讀取數據的輸入流。

6.集合操作:

????????List:用于存儲文件頭信息的列表。

7.比較器(Comparator):用于對文件頭列表進行排序。

8.第三方庫?commons-io?中的?FileUtils?類:(此jar包在文末)

? ? ? ?用于刪除目錄和復制輸入流到文件。

二、代碼展示(分解版)

步驟1:判斷文件類型

  • ????????若是".zip"文件則調用unzip()方法來解壓縮 ZIP 文件,若是".rar"文件則調用unrar()方法來解壓縮 RAR?文件
//指定文件夾String Path = “D:\\...\\xxxx.zip”String Path = “D:\\...\\xxxx.rar”
}
//1.判斷文件類型if(path.endsWith(".zip")) {unzip(path);}else if(path.endsWith(".rar")) {unrar(path);}	}

步驟2:定義unzip()方法

  • 根據輸入的文件路徑創建源文件對象。
  • 確定解壓縮后的根目錄路徑,并創建對應的文件對象。
  • 如果根目錄已存在,嘗試刪除(包括使用?FileUtils?工具類刪除非空目錄),然后重新創建根目錄。
  • 創建用于讀取 ZIP 格式的輸入流。
  • 遍歷壓縮包中的每個條目(子文件或子目錄)。
  • 為每個條目創建對應的文件對象。
  • 判斷條目是子文件還是子目錄,分別進行創建文件或目錄的操作。
  • 對于子文件,創建輸出流,讀取輸入流中的數據并寫入子文件。
  • 處理可能出現的文件未找到和輸入輸出異常。
//2.解壓縮zip格式public static void unzip(String path) {//(1)根據原始路徑(字符串),創建源文件(File對象)File sourceFile = new File(path);//(2)根目錄String sourceName = sourceFile.getName();File rootDir = new File(sourceFile.getParent()+"\\"+sourceName.substring(0,sourceName.lastIndexOf(".")));//(3)判斷根目錄是否已經存在if(rootDir.exists()) {//若存在,則刪除rootDir.delete();//只能刪除空目錄//使用commons-io包提供的FileUtils工具類進行刪除try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}//(4)創建根目錄rootDir.mkdir();//(5)ZipInputStream:用于進行zip格式的壓縮輸入流try {ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));//(6)遍歷壓縮包中每個子文件子目錄(zipEntry類型的對象)ZipEntry zipEntry = null;while((zipEntry = in.getNextEntry())!=null) {//(7)創建子文件子目錄(File對象)File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());//(8)判斷是子文件還是子目錄(不是子目錄就是子文件)if(zipEntry.isDirectory()) {//物理磁盤創建子目錄file.mkdir();}else {//物理磁盤創建子文件file.createNewFile();//(9)子文件的寫入//讀取當前壓縮包的子文件,并通過輸出流out寫入新子文件中try (FileOutputStream out = new FileOutputStream(file)) {byte[] buff = new byte[1024];int len = -1;while((len = in.read(buff))!=-1) {out.write(buff,0,len);}}}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

?步驟3:定義unrar()方法

  • 根據輸入的 RAR 文件路徑創建根目錄的文件對象。
  • 判斷根目錄是否存在,如果存在則嘗試刪除(使用?FileUtils?處理可能的異常),然后創建根目錄。
  • 創建用于讀取 RAR 壓縮文件的?Archive?對象。
  • 獲取壓縮文件中的所有子目錄和子文件的?FileHeader?對象,并存儲在列表中。
  • 按照子目錄和子文件的名稱對列表進行排序。
  • 遍歷列表中的每個?FileHeader?對象。
  • 根據?FileHeader?對象創建對應的文件對象。
  • 判斷是子目錄還是子文件,分別進行創建目錄或文件的操作。
  • 對于子文件,獲取輸入流并使用?FileUtils?將輸入流復制到子文件中。
  • 處理可能出現的 RAR 相關異常和輸入輸出異常。
//3.解壓縮rar格式public static void unrar(String path) {//(1)創建解壓縮的根目錄File rarFile = new File(path);File rootDir = new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));//(2)判斷是否存在if(rootDir.exists()) {try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}rootDir.mkdir();//(3)創建Archive對象,用于讀取rar壓縮文件格式try (Archive archive = new Archive(new FileInputStream(path))){//(4)獲取壓縮文件所有子目錄子文件(FileHeader對象)List<FileHeader> fileheaderList = archive.getFileHeaders();//(5)按照子目錄(子文件)名稱排序fileheaderList.sort(new Comparator<FileHeader>() {@Overridepublic int compare(FileHeader o1, FileHeader o2) {return o1.getFileName().compareTo(o2.getFileName());}});//(6)遍歷子目錄子文件for(FileHeader fd : fileheaderList) {File f = new File(rootDir.getPath()+"\\"+fd.getFileName());if(fd.isDirectory()) {//物理磁盤創建子目錄f.mkdir();}else {//物理磁盤創建子文件f.createNewFile();//獲取壓縮包中子文件輸入流InputStream in = archive.getInputStream(fd);//復制文件輸入流至子文件FileUtils.copyInputStreamToFile(in, f);}}} catch (RarException | IOException e) {e.printStackTrace();}}

三、代碼展示(整體版)

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;import org.apache.commons.io.FileUtils;import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;public class Test {
//指定文件夾String Path = “D:\\...\\xxxx.zip”String Path = “D:\\...\\xxxx.rar”
}
//1.判斷文件類型if(path.endsWith(".zip")) {unzip(path);}else if(path.endsWith(".rar")) {unrar(path);}	}//2.解壓縮zip格式public static void unzip(String path) {//(1)根據原始路徑(字符串),創建源文件(File對象)File sourceFile = new File(path);//(2)根目錄String sourceName = sourceFile.getName();File rootDir = new File(sourceFile.getParent()+"\\"+sourceName.substring(0,sourceName.lastIndexOf(".")));//(3)判斷根目錄是否已經存在if(rootDir.exists()) {//若存在,則刪除rootDir.delete();//只能刪除空目錄//使用commons-io包提供的FileUtils工具類進行刪除try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}//(4)創建根目錄rootDir.mkdir();//(5)ZipInputStream:用于進行zip格式的壓縮輸入流try {ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));//(6)遍歷壓縮包中每個子文件子目錄(zipEntry類型的對象)ZipEntry zipEntry = null;while((zipEntry = in.getNextEntry())!=null) {//(7)創建子文件子目錄(File對象)File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());//(8)判斷是子文件還是子目錄(不是子目錄就是子文件)if(zipEntry.isDirectory()) {//物理磁盤創建子目錄file.mkdir();}else {//物理磁盤創建子文件file.createNewFile();//(9)子文件的寫入//讀取當前壓縮包的子文件,并通過輸出流out寫入新子文件中try (FileOutputStream out = new FileOutputStream(file)) {byte[] buff = new byte[1024];int len = -1;while((len = in.read(buff))!=-1) {out.write(buff,0,len);}}}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//3.解壓縮rar格式public static void unrar(String path) {//(1)創建解壓縮的根目錄File rarFile = new File(path);File rootDir = new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));//(2)判斷是否存在if(rootDir.exists()) {try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}rootDir.mkdir();//(3)創建Archive對象,用于讀取rar壓縮文件格式try (Archive archive = new Archive(new FileInputStream(path))){//(4)獲取壓縮文件所有子目錄子文件(FileHeader對象)List<FileHeader> fileheaderList = archive.getFileHeaders();//(5)按照子目錄(子文件)名稱排序fileheaderList.sort(new Comparator<FileHeader>() {@Overridepublic int compare(FileHeader o1, FileHeader o2) {return o1.getFileName().compareTo(o2.getFileName());}});//(6)遍歷子目錄子文件for(FileHeader fd : fileheaderList) {File f = new File(rootDir.getPath()+"\\"+fd.getFileName());if(fd.isDirectory()) {//物理磁盤創建子目錄f.mkdir();}else {//物理磁盤創建子文件f.createNewFile();//獲取壓縮包中子文件輸入流InputStream in = archive.getInputStream(fd);//復制文件輸入流至子文件FileUtils.copyInputStreamToFile(in, f);}}} catch (RarException | IOException e) {e.printStackTrace();}}
}

四、使用場景

? ? 以上提供了兩種常見壓縮格式(ZIP 和 RAR)文件的解壓縮功能。通過判斷輸入文件的格式(根據文件擴展名),調用相應的解壓縮方法(unzip?或?unrar),能夠將壓縮文件中的內容正確地解壓到指定的目錄中。

這種功能在很多場景中都非常有用,例如:

  1. 數據處理和分析:當獲取到壓縮形式的數據時,需要解壓縮來獲取原始數據進行處理和分析。
  2. 文件傳輸和存儲:在文件傳輸或存儲過程中,壓縮可以節省空間和提高傳輸效率,到達目的地后再解壓縮以恢復原始文件結構。
  3. 軟件開發:在開發過程中,可能需要處理和整合來自不同來源的壓縮文件資源。

????????總的來說,這段代碼提供了一種靈活且可復用的方式來處理 ZIP 和 RAR 壓縮文件的解壓縮操作,滿足了在各種應用中對壓縮文件進行處理的需求。

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

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

相關文章

Point Cloud Library (PCL) for Python - pclpy 安裝指南 (2)

Point Cloud Library (PCL) for Python - pclpy 安裝指南 (1) 導入庫 from pclpy import pcl import numpy as np導入pclpy庫中的pcl模塊&#xff0c;用于處理點云數據。numpy庫用于處理數值數據。 讀取點云 cloud pcl.PointCloud.PointXYZRGB() pcl.io.loadPCDFile(F:\\bunn…

2024年西安鐵一中集訓DAY1---- 雜題選講

文章目錄 牛客練習賽125 E 聯誼活動&#xff08;枚舉&#xff0c;分討&#xff09;牛客練習賽125 F 玻璃彈珠&#xff08;類莫隊&#xff0c;離線詢問&#xff0c;數據結構&#xff09;2024ccpc長春邀請賽 D Parallel Lines&#xff08;隨機化&#xff09;2024ccpc長春邀請賽 E…

STM32智能健康監測系統教程

目錄 引言環境準備智能健康監測系統基礎代碼實現&#xff1a;實現智能健康監測系統 4.1 數據采集模塊 4.2 數據處理與分析模塊 4.3 通信與網絡系統實現 4.4 用戶界面與數據可視化應用場景&#xff1a;健康監測與優化問題解決方案與優化收尾與總結 1. 引言 智能健康監測系統通…

k8s 容器環境下的鏡像如何轉換為docker 使用

在無法連接registry 的環境中&#xff0c;想要把 crictl 中的鏡像給docker 使用&#xff0c;應該怎么處理&#xff1f; 其實容器鏡像是通用的&#xff0c;crictl 和ctr 以及docker 鏡像是可以互相使用的&#xff0c;因為docker 在1.10版本之后遵從了OCI。所以crictl 環境下的鏡…

Android Studio 的Gradle下載慢,Gradle切換下載源

看圖 下面的文字地址因為轉義符號的問題&#xff0c;https后面少了一個斜杠看圖片進行補充&#xff0c;直接復制不知道能不能用 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip

浪潮服務器內存物理插槽位置

浪潮服務器內存物理插槽位置 如下圖所示

Doze和AppStandby白名單配置方法和說明

機制 配置路徑 配置案例 說明 影響機制 調試命令 Doze /platform/frameworks/base /data/etc/platform.xml allow-in-power-save 【系統應用Doze白名單配置】 Doze\Job\AppStandby\Alarm\WakeLock\Sync 查看Doze白名單:adb shell dumpsys deviceidle 添加Doze白名單…

漏洞挖掘之信息搜集(一)

本篇文章只從信息搜集的步驟整理 一、選好你要挖掘的src 這一點一定要明確,定好一個,然后下定決心一定要挖到一個高危 常見src總結: 360眾測(需要考核) 漏洞盒子(還可以,審核很慢)----基本無要求 補天:有錢,但要求高,百度收錄占比權重大于等于1或者或者谷歌權…

前端進階全棧計劃:Java基礎語法

前言 本教程旨在幫助初學者系統地掌握Java的基礎知識。我們將從Java的基本語法開始&#xff0c;逐步深入到面向對象編程、異常處理、多線程編程等核心概念。無論你是編程新手&#xff0c;還是希望夯實基礎的開發者&#xff0c;這份指南都將帶你走進Java的世界&#xff0c;打下堅…

昇思MindSpore學習筆記6-06計算機視覺--Vision Transormer圖像分類

摘要&#xff1a; 記錄MindSpore AI框架使用ViT模型在ImageNet圖像數據分類上進行訓練、驗證、推理的過程和方法。包括環境準備、下載數據集、數據集加載、模型解析與構建、模型訓練與推理等。 一、概念 1. ViT模型 Vision Transformer 自注意結構模型 Self-Attention Tran…

MySQL(基礎篇)

DDL (Data Definition Language) 數據定義語言&#xff0c;用來定義數據庫對象(數據庫&#xff0c;表&#xff0c; 字段) DML (Data Manipulation Languag) 數據操作語言&#xff0c;用來對數據庫表中的數據進行增刪改 DQL (Data Query Language) 數據查詢語言&#xff0c;用…

前綴,中綴,后綴表達式

前綴表達式 前綴表達式&#xff08;也稱為波蘭式&#xff09;是一種將運算符放在操作數之前的表示數學表達式的方法。在前綴表達式中&#xff0c;操作符出現在它們所操作的操作數之前。 例如&#xff0c;將中綴表達式5 3轉換為前綴表達式&#xff0c;可以寫成 5 3。在這個例…

9 個讓 Python 性能更高的小技巧,你掌握了嗎?

我們經常聽到 “Python 太慢了”&#xff0c;“Python 性能不行”這樣的觀點。但是&#xff0c;只要掌握一些編程技巧&#xff0c;就能大幅提升 Python 的運行速度。 今天就讓我們一起來看下讓 Python 性能更高的 9 個小技巧 python學習資料分享&#xff08;無償&#xff09;…

數據(圖像)增廣

一、數據增強 1、增加一個已有數據集&#xff0c;使得有更多的多樣性&#xff0c;比如加入不同的背景噪音、改變圖片的顏色和形狀。 2、增強數據是在線生成的 3、增強類型&#xff1a; &#xff08;1&#xff09;翻轉 &#xff08;2&#xff09;切割 &#xff08;3&#xf…

金龍魚:只是躺槍?

中儲糧罐車運輸油罐混用事件持續發酵&#xff0c;食用油板塊集體躺槍。 消費者憤怒的火&#xff0c;怕是會讓食用油企們一點就著。 今天&#xff0c;我們聊聊“油”茅——金龍魚。 一邊是業內人士指出&#xff0c;油罐混用的現象普遍存在&#xff0c;另一邊是金龍魚回應稱&am…

2972.力扣每日一題7/11 Java(擊敗100%)

博客主頁&#xff1a;音符猶如代碼系列專欄&#xff1a;算法練習關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? 目錄 解題思路 解題方法 時間復雜度 空間復雜度 Code 解題思路 該問…

RISC-V主要指令集介紹及規則

推薦資料 RISC-V Reader / RISC-V開放架構設計之道&#xff0c;適合新手閱讀。 概述 RISC-V的模塊化到底是如何實現的呢&#xff1f; 核心部分&#xff1a;RV32I&#xff0c;代表32位字長的整型指令集&#xff08;Integer&#xff09;&#xff0c;包含了許多整型指令如load…

在C++項目中添加錄像功能:從攝像頭捕獲到視頻文件的保存

在C項目中添加錄像功能&#xff1a;從攝像頭捕獲到視頻文件的保存 在這篇博客中&#xff0c;我們將介紹如何在一個現有的C項目中添加錄像功能&#xff0c;具體包括如何從攝像頭捕獲圖像并將其保存為視頻文件。我們將使用OpenCV庫來處理圖像捕獲和視頻寫入。 目錄 引言準備工…

Python學習筆記35:進階篇(二十四)pygame的使用之音頻文件播放

前言 基礎模塊的知識通過這么長時間的學習已經有所了解&#xff0c;更加深入的話需要通過完成各種項目&#xff0c;在這個過程中逐漸學習&#xff0c;成長。 我們的下一步目標是完成python crash course中的外星人入侵項目&#xff0c;這是一個2D游戲項目。在這之前&#xff…

元組列表之案例

1.列表推導式 基本語法&#xff1a; [表達式 for語句1 if 語句1 for語句2 if語句2 ........ ] 1.零到九的平方列表 a [i*i for i in range(10)] print(a) 2.for 循環前面加if else #如果是偶數乘以2&#xff0c;如果是奇數直接輸出 a [i*2 if i%2 0 else i for i in ran…