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

通過Java實現(xiàn)zip文件與rar文件解壓縮的詳細步驟

 更新時間:2024年07月12日 10:16:55   作者:冷酷無情小美  
這篇文章主要給大家介紹了如何通過?Java?來完成?zip?文件與?rar?文件的解壓縮,文中通過代碼示例講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

一、用到的知識點

1.IO流:

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

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

2.文件操作相關(guān):

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

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

3.壓縮文件處理:

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

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

4.異常處理:

FileNotFoundException:當(dāng)嘗試訪問不存在的文件時拋出。

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

RarException:處理與 RAR 壓縮文件操作相關(guān)的特定異常。

5.數(shù)據(jù)輸入輸出流:

InputStream:用于讀取數(shù)據(jù)的輸入流。

6.集合操作:

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

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

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

用于刪除目錄和復(fù)制輸入流到文件。

二、代碼展示(分解版)

步驟1:判斷文件類型

  • 若是".zip"文件則調(diào)用unzip()方法來解壓縮 ZIP 文件,若是".rar"文件則調(diào)用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()方法

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

步驟3:定義unrar()方法

  • 根據(jù)輸入的 RAR 文件路徑創(chuàng)建根目錄的文件對象。
  • 判斷根目錄是否存在,如果存在則嘗試刪除(使用 FileUtils 處理可能的異常),然后創(chuàng)建根目錄。
  • 創(chuàng)建用于讀取 RAR 壓縮文件的 Archive 對象。
  • 獲取壓縮文件中的所有子目錄和子文件的 FileHeader 對象,并存儲在列表中。
  • 按照子目錄和子文件的名稱對列表進行排序。
  • 遍歷列表中的每個 FileHeader 對象。
  • 根據(jù) FileHeader 對象創(chuàng)建對應(yīng)的文件對象。
  • 判斷是子目錄還是子文件,分別進行創(chuàng)建目錄或文件的操作。
  • 對于子文件,獲取輸入流并使用 FileUtils 將輸入流復(fù)制到子文件中。
  • 處理可能出現(xiàn)的 RAR 相關(guān)異常和輸入輸出異常。
//3.解壓縮rar格式
	public 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(".")));
		//(2)判斷是否存在
		if(rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		rootDir.mkdir();
		
		//(3)創(chuàng)建Archive對象,用于讀取rar壓縮文件格式
		try (Archive archive = new Archive(new FileInputStream(path))){
			
			//(4)獲取壓縮文件所有子目錄子文件(FileHeader對象)
			List<FileHeader> fileheaderList = archive.getFileHeaders();
			
			//(5)按照子目錄(子文件)名稱排序
			fileheaderList.sort(new Comparator<FileHeader>() {
				@Override
				public 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()) {
					//物理磁盤創(chuàng)建子目錄
					f.mkdir();
				}else {
					//物理磁盤創(chuàng)建子文件
					f.createNewFile();
					
					//獲取壓縮包中子文件輸入流
					InputStream in = archive.getInputStream(fd);
					
					//復(fù)制文件輸入流至子文件
					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)根據(jù)原始路徑(字符串),創(chuàng)建源文件(File對象)
		File sourceFile = new File(path);
		
		//(2)根目錄
		String sourceName = sourceFile.getName();
		File rootDir = new File(sourceFile.getParent()+"\\"+sourceName.substring(0,sourceName.lastIndexOf(".")));
		
		//(3)判斷根目錄是否已經(jīng)存在
		if(rootDir.exists()) {
			//若存在,則刪除
			rootDir.delete();//只能刪除空目錄
			//使用commons-io包提供的FileUtils工具類進行刪除
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		//(4)創(chuàng)建根目錄
		rootDir.mkdir();
		
		//(5)ZipInputStream:用于進行zip格式的壓縮輸入流
		try {
			ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));
			
			//(6)遍歷壓縮包中每個子文件子目錄(zipEntry類型的對象)
			ZipEntry zipEntry = null;
			while((zipEntry = in.getNextEntry())!=null) {
				//(7)創(chuàng)建子文件子目錄(File對象)
				File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());
				
				//(8)判斷是子文件還是子目錄(不是子目錄就是子文件)
				if(zipEntry.isDirectory()) {
					//物理磁盤創(chuàng)建子目錄
					file.mkdir();
				}else {
					//物理磁盤創(chuàng)建子文件
					file.createNewFile();
					//(9)子文件的寫入
					//讀取當(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 (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//3.解壓縮rar格式
	public 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(".")));
		//(2)判斷是否存在
		if(rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		rootDir.mkdir();
		
		//(3)創(chuàng)建Archive對象,用于讀取rar壓縮文件格式
		try (Archive archive = new Archive(new FileInputStream(path))){
			
			//(4)獲取壓縮文件所有子目錄子文件(FileHeader對象)
			List<FileHeader> fileheaderList = archive.getFileHeaders();
			
			//(5)按照子目錄(子文件)名稱排序
			fileheaderList.sort(new Comparator<FileHeader>() {
				@Override
				public 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()) {
					//物理磁盤創(chuàng)建子目錄
					f.mkdir();
				}else {
					//物理磁盤創(chuàng)建子文件
					f.createNewFile();
					
					//獲取壓縮包中子文件輸入流
					InputStream in = archive.getInputStream(fd);
					
					//復(fù)制文件輸入流至子文件
					FileUtils.copyInputStreamToFile(in, f);
				}
			}
			
		} catch (RarException | IOException e) {
			e.printStackTrace();
		}
	}
}
 

四、使用場景

以上提供了兩種常見壓縮格式(ZIP 和 RAR)文件的解壓縮功能。通過判斷輸入文件的格式(根據(jù)文件擴展名),調(diào)用相應(yīng)的解壓縮方法(unzip 或 unrar),能夠?qū)嚎s文件中的內(nèi)容正確地解壓到指定的目錄中。

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

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

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

以上就是通過Java實現(xiàn)zip文件與rar文件解壓縮的詳細步驟的詳細內(nèi)容,更多關(guān)于Java實現(xiàn)zip與rar文件解壓縮的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring注解在自定義jar包中無法被掃描的解決方案

    spring注解在自定義jar包中無法被掃描的解決方案

    這篇文章主要介紹了spring注解在自定義jar包中無法被掃描的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring MVC-@RequestMapping注解詳解

    Spring MVC-@RequestMapping注解詳解

    @RequestMapping注解的作用,就是將請求和處理請求的控制器方法關(guān)聯(lián)起來,建立映射關(guān)系。這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Java中Boolean引發(fā)缺陷的解決

    Java中Boolean引發(fā)缺陷的解決

    本文主要介紹了Java中Boolean引發(fā)缺陷的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java虛擬機調(diào)用Java主類的main()方法

    Java虛擬機調(diào)用Java主類的main()方法

    這篇文章主要介紹了Java虛擬機調(diào)用Java主類的main()方法,前一篇文章我們介紹了關(guān)于Java虛擬機HotSpot
    2021-11-11
  • Mybatis 逆向工程的三種方法詳解

    Mybatis 逆向工程的三種方法詳解

    這篇文章主要介紹了Mybatis 逆向工程的三種方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java用BigDecimal解決double類型相減時可能存在的誤差

    Java用BigDecimal解決double類型相減時可能存在的誤差

    這篇文章主要介紹了Java用BigDecimal解決double類型相減時可能存在的誤差,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • spring boot加載freemarker模板路徑的方法

    spring boot加載freemarker模板路徑的方法

    這篇文章主要介紹了spring boot加載freemarker模板路徑的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • java分割字符串多種方法(附例子)

    java分割字符串多種方法(附例子)

    這篇文章主要給大家介紹了關(guān)于java分割字符串多種方法的相關(guān)資料,Java中有多種方法可以實現(xiàn)字符串分割,文中將每張方法都給出了代碼示例,需要的朋友可以參考下
    2023-10-10
  • java 實現(xiàn)發(fā)短信功能---騰訊云短信

    java 實現(xiàn)發(fā)短信功能---騰訊云短信

    如今發(fā)短信功能已經(jīng)成為互聯(lián)網(wǎng)公司的標(biāo)配,接下來通過本文給大家介紹java 實現(xiàn)發(fā)短信功能---騰訊云短信 ,需要的朋友可以參考下
    2019-08-08
  • 一篇文章帶你了解java接口與繼承

    一篇文章帶你了解java接口與繼承

    這篇文章主要介紹了Java接口和繼承操作,結(jié)合具體實例形式分析了Java接口和繼承與使用的相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下
    2021-08-08

最新評論

称多县| 红原县| 克东县| 应用必备| 昭平县| 弥勒县| 凤城市| 石家庄市| 长乐市| 富蕴县| 江川县| 陇西县| 安岳县| 茶陵县| 武汉市| 南宁市| 通山县| 依安县| 靖边县| 高碑店市| 茂名市| 禄丰县| 鄱阳县| 镇巴县| 泸州市| 黄山市| 开阳县| 张家港市| 万盛区| 启东市| 阿拉善右旗| 宜章县| 浠水县| 鄂托克旗| 晋州市| 淮安市| 五指山市| 葫芦岛市| 南阳市| 乌兰县| 扎兰屯市|