Java 壓縮包解壓實現(xiàn)代碼
在Java開發(fā)中,處理壓縮文件(如ZIP、RAR等)是一項常見的任務(wù),特別是在需要處理大量數(shù)據(jù)、備份或分發(fā)應(yīng)用程序時。Java標(biāo)準(zhǔn)庫(Java SE)提供了對ZIP格式的原生支持,通過java.util.zip包中的類來實現(xiàn)壓縮和解壓功能。本文將重點介紹如何使用Java來解壓ZIP或RAR壓縮包。
一、解壓壓縮包
解壓壓縮包,借助ZipInputStream類,可以讀取到壓縮包中的每一個文件,然后根據(jù)讀取到的文件屬性,寫入到相應(yīng)路徑下即可。對于解壓壓縮包中是文件樹的結(jié)構(gòu),每讀取到一個文件后,如果是多層路徑下的文件,需要先創(chuàng)建父目錄,再寫入文件流。
1.zip解壓代碼實現(xiàn):
// 解壓zip格式
public static void unzip(String path){
// 根據(jù)原始路徑(字符串),創(chuàng)建源文件(File對象)
File sourceFile = new File(path);
// 根目錄
String sourceFileName = sourceFile.getName();
File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
// 判斷根目錄是否已經(jīng)存在
if(rootDir.exists()){
// 如果存在,則刪除
// rootDir.delete(); // 僅能刪除空目錄
// 使用commons-io包提供的FileUtils工具類進行刪除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
// 創(chuàng)建根目錄
rootDir.mkdirs();
// System.out.println(rootDir);
// ZipInputStream:用于進行zip格式的壓縮文件輸入流
try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
// 遍歷壓縮包中的每個子目錄或子文件(ZipEntry類型的對象)
ZipEntry zipEntry = null;
while((zipEntry = in.getNextEntry()) != null){
// System.out.println(zipEntry.getName());
// 創(chuàng)建子目錄或子文件(File對象)
// F:\Software\IDEA\Projects\test\easyftp-server-1.7.0.10-cn
File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());
if(zipEntry.isDirectory()){
// 物理磁盤創(chuàng)建子目錄
file.mkdirs();
}else{
// 物理磁盤創(chuàng)建子文件
file.createNewFile();
// 讀取當(dāng)前壓縮包中的子文件,并通過輸出流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 (IOException e) {
e.printStackTrace();
}
}2.rar解壓代碼實現(xiàn):
// 解壓縮rar格式
private static void unrar(String path) {
// 1.創(chuàng)建解壓縮的根目錄
File rarFile = new File(path);
// File rootDir = new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
String rarFileName = rarFile.getName();
File rootDir = new File(rarFile.getParent()+"\\"+rarFileName.substring(0,rarFileName.lastIndexOf(".")));
if(rootDir.exists()){
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
rootDir.mkdirs();
// 創(chuàng)建Archive對象,用于讀取rar壓縮文件格式
try(Archive archive = new Archive(new FileInputStream(path))) {
// 讀取壓縮文件中的所有子目錄或子文件(FileHeader對象)
List<FileHeader> fileHeaderList = archive.getFileHeaders();
// 按照子目錄(子文件)名來排序
fileHeaderList.sort(new Comparator<FileHeader>() {
@Override
public int compare(FileHeader o1, FileHeader o2) {
return o1.getFileName().compareTo(o2.getFileName());
}
});
// 遍歷子目錄和子文件
for (FileHeader fd:fileHeaderList) {
System.out.println(fd.getFileName());
File f = new File(rootDir.getPath()+"\\"+fd.getFileName());
if(fd.isDirectory()){
// 創(chuàng)建新子目錄
f.mkdirs();
}else{
// 創(chuàng)建新子文件
f.createNewFile();
// 獲取壓縮包中的子文件輸出流
InputStream in = archive.getInputStream(fd);
// 復(fù)制文件輸入流至新子文件
FileUtils.copyInputStreamToFile(in,f);
}
}
} catch (RarException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}3.調(diào)用解壓方法:
最后,在main方法或任何其他適當(dāng)?shù)奈恢谜{(diào)用unzip方法,傳入ZIP或RAR文件的路徑和解壓到的目標(biāo)。
import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;
import org.apache.commons.io.FileUtils;
import java.io.*;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public static void main(String[] args) {
// String path = "F:\\Software\\IDEA\\Projects\\test\\easyftp-server-1.7.0.10-cn.zip";
String path = "F:\\Software\\IDEA\\Projects\\test\\實驗案例.rar";
if(path.endsWith(".zip")) {
unzip(path);
} else if(path.endsWith(".rar")){
unrar(path);
}
}
二、注意事項
- 文件路徑處理:在解壓時,注意正確處理ZIP文件中的文件路徑,以避免安全風(fēng)險(如路徑遍歷攻擊)。
- 異常處理:在解壓過程中,可能會遇到文件讀取錯誤、寫入錯誤或權(quán)限問題,應(yīng)妥善處理這些異常。
- 性能優(yōu)化:對于大型ZIP文件,考慮使用更高效的IO操作和流控制來優(yōu)化解壓速度。
- 壓縮用到的JAR包:需要使用第三方庫,如commons-io包。
三、總結(jié)
- 在解壓縮文件過程中,主要是對流的讀取操作,注意進行異常處理,以及關(guān)閉流。
- 解壓縮文件時,注意空文件夾的處理。
到此這篇關(guān)于Java 壓縮包解壓實現(xiàn)過程的文章就介紹到這了,更多相關(guān)Java 壓縮包解壓內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java負(fù)載均衡算法實現(xiàn)之輪詢和加權(quán)輪詢
網(wǎng)上找了不少負(fù)載均衡算法的資源,都不夠全面,后來自己結(jié)合了網(wǎng)上的一些算法實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Java負(fù)載均衡算法實現(xiàn)之輪詢和加權(quán)輪詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04
Javaweb實現(xiàn)完整個人博客系統(tǒng)流程
這篇文章主要介紹了怎樣用Java來實現(xiàn)一個完整的個人博客系統(tǒng),我們通過實操上手的方式可以高效的鞏固所學(xué)的基礎(chǔ)知識,感興趣的朋友一起來看看吧2022-03-03
Java中字符串與日期轉(zhuǎn)換常見方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中字符串與日期轉(zhuǎn)換常見方法的相關(guān)資料,在Java編程中經(jīng)常需要將字符串表示的日期轉(zhuǎn)換為日期對象進行處理,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11
Docker?Compose+Jenkins自動化部署流程圖文教程
Jenkins是一款非常流行的開源持續(xù)集成工具,廣泛用于項目開發(fā),具有自動化構(gòu)建、測試和部署等功能,這篇文章主要介紹了Docker?Compose+Jenkins自動化部署流程的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2026-04-04
SpringBoot整合MyBatis實現(xiàn)CRUD操作項目實踐
本文主要介紹了SpringBoot整合MyBatis實現(xiàn)CRUD操作項目實踐,如何實現(xiàn)數(shù)據(jù)庫的CRUD創(chuàng)建、讀取、更新、刪除操作,具有一定的參考價值,感興趣的可以了解一下2024-02-02

