Java中解壓縮文件的方法詳解(通用)
如何實現(xiàn)一個上傳壓縮包,然后將壓縮包進(jìn)行解壓?
下面我們就來實現(xiàn)一下這個代碼。
最終實現(xiàn)的效果:
上傳一個壓縮包文件,會將壓縮包文件下載到本地,然后再將壓縮包解壓到同目錄下的extracted文件夾下。
這是壓縮包內(nèi)的文件,三張圖片
一、使用的技術(shù)
使用的是Java自帶的java.util.zip.ZipFile包。
java.util.zip.ZipFile
是 Java 中用于處理 ZIP 文件的類。它提供了讀取 ZIP 文件內(nèi)容的功能,允許你以編程方式從 ZIP 文件中提取文件和目錄結(jié)構(gòu),以及讀取其中的數(shù)據(jù)。
下面是一些 ZipFile
類的主要特性和用法:
讀取 ZIP 文件內(nèi)容:
ZipFile
允許你打開一個 ZIP 文件,并從中讀取內(nèi)容。你可以通過提供 ZIP 文件的路徑或者File
對象來創(chuàng)建一個ZipFile
實例。訪問 ZIP 文件中的條目(entries): 一旦你打開了一個 ZIP 文件,你可以通過
entries()
方法獲取 ZIP 文件中的所有條目。每個條目代表 ZIP 文件中的一個文件或目錄。提取文件內(nèi)容: 通過
getInputStream()
方法,你可以從 ZIP 文件中提取特定文件的內(nèi)容。這個方法返回一個InputStream
對象,你可以使用它來讀取文件的數(shù)據(jù)。關(guān)閉 ZIP 文件: 使用
close()
方法關(guān)閉ZipFile
實例,釋放相關(guān)資源。
二、實際用法
實際使用的時候是從前端上傳壓縮包文件,然后后端接收。(具體參考后文Contrller中的完整代碼邏輯)
1、上傳的一般都是MultipartFile
類型,需要先將MultipartFile類型轉(zhuǎn)為File類型,使用FileUtils.copyInputStreamToFile
這個方法。
2、轉(zhuǎn)換為File類型時就需要先將文件存到本地,所以在這里指定了一個壓縮包的文件路徑File fileTemp = new File("D:\\unzipTest\\Test.zip");
3、使用getAbsolutePath
方法來獲取這個路徑,將壓縮包的本地路徑傳給fileUncompressing
文件解壓縮方法即可完成解壓。
4、在文件解壓縮方法中,會將文件解壓到D:\\unzipTest\\extracted
這個目錄下,可以自行修改,也可以作為一個參數(shù)傳進(jìn)去。
我這里解壓縮的時候獲取了某個固定文件類型的文件路徑集合,如果需要在解壓縮的時候做邏輯處理,可以參考。如果只是單純的解壓縮,可以把這個邏輯刪掉。
//要下載到的本地臨時文件路徑 File fileTemp = new File("D:\\unzipTest\\Test.zip"); File parentFolder = fileTemp.getParentFile(); //如果父文件夾(unzipTest)不存在則創(chuàng)建 if(!parentFolder.exists()){ //創(chuàng)建父文件夾及其所有上級文件夾 parentFolder.mkdir(); } //MultipartFile轉(zhuǎn)File org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), fileTemp); //壓縮包文件路徑 String zipFilePath = fileTemp.getAbsolutePath(); fileUncompressing(zipFilePath);
三、文件解壓縮方法(通用)
/** * 文件解壓縮 * @return */ public static List<String> fileUncompressing(String zipFilePath){ String targetFolder = "D:\\unzipTest\\extracted"; //文件名后綴 String ncLastName=".nc"; List<String> pathList=new ArrayList<>(); try { // 創(chuàng)建目標(biāo)文件夾 File targetDir = new File(targetFolder); targetDir.mkdirs(); // 打開壓縮文件 // ZipFile zipFile = new ZipFile(zipFilePath); ZipFile zipFile = new ZipFile(zipFilePath, Charset.forName("gbk")); // 遍歷壓縮文件中的所有條目 Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); // 解壓縮條目到目標(biāo)文件夾 String entryName = entry.getName(); entryName = new String(entryName.getBytes(Charset.forName("gbk"))); File entryFile = new File(targetDir, entryName); if (entry.isDirectory()) { entryFile.mkdirs(); } else { entryFile.getParentFile().mkdirs(); InputStream inputStream = zipFile.getInputStream(entry); OutputStream outputStream = new FileOutputStream(entryFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } outputStream.close(); inputStream.close(); } //判斷文件是否是.nc結(jié)尾 if (entryName.endsWith(ncLastName)) { // 拼接路徑 Path path = Paths.get(targetFolder, entryName); pathList.add(path.toString()); } } // 關(guān)閉壓縮文件 zipFile.close(); // log.info("文件讀取完成"); System.out.println("文件讀取完成"); } catch (ZipException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return pathList; }
四、完整代碼邏輯
@RestController @RequestMapping("/practice") public class PracticeController extends BaseController { @PostMapping("/list") public TableDataInfo list(MultipartFile multipartFile) throws IOException { //要下載到的本地臨時文件路徑 File fileTemp = new File("D:\\unzipTest\\Test.zip"); File parentFolder = fileTemp.getParentFile(); //如果父文件夾(unzipTest)不存在則創(chuàng)建 if(!parentFolder.exists()){ //創(chuàng)建父文件夾及其所有上級文件夾 parentFolder.mkdir(); } //MultipartFile轉(zhuǎn)File org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), fileTemp); //壓縮包文件路徑 String zipFilePath = fileTemp.getAbsolutePath(); fileUncompressing(zipFilePath); startPage(); List<StudentScores> list = new ArrayList<>(); return getDataTable(list); } /** * 文件解壓縮 * @return */ public static List<String> fileUncompressing(String zipFilePath){ // String zipFilePath = "D:\\unzipTest\\ERA5.zip"; String targetFolder = "D:\\unzipTest\\extracted"; //文件名后綴 String ncLastName=".nc"; List<String> pathList=new ArrayList<>(); try { // 創(chuàng)建目標(biāo)文件夾 File targetDir = new File(targetFolder); targetDir.mkdirs(); // 打開壓縮文件 // ZipFile zipFile = new ZipFile(zipFilePath); ZipFile zipFile = new ZipFile(zipFilePath, Charset.forName("gbk")); // 遍歷壓縮文件中的所有條目 Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); // 解壓縮條目到目標(biāo)文件夾 String entryName = entry.getName(); entryName = new String(entryName.getBytes(Charset.forName("gbk"))); File entryFile = new File(targetDir, entryName); if (entry.isDirectory()) { entryFile.mkdirs(); } else { entryFile.getParentFile().mkdirs(); InputStream inputStream = zipFile.getInputStream(entry); OutputStream outputStream = new FileOutputStream(entryFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } outputStream.close(); inputStream.close(); } //判斷文件是否是.nc結(jié)尾 if (entryName.endsWith(ncLastName)) { // 拼接路徑 Path path = Paths.get(targetFolder, entryName); pathList.add(path.toString()); } } // 關(guān)閉壓縮文件 zipFile.close(); // log.info("文件讀取完成"); System.out.println("文件讀取完成"); } catch (ZipException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return pathList; } }
總結(jié)
到此這篇關(guān)于Java中解壓縮文件的方法詳解的文章就介紹到這了,更多相關(guān)Java解壓縮文件方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解MyBatis批量插入數(shù)據(jù)Mapper配置文件的寫法
本篇文章主要介紹了詳解MyBatis批量插入數(shù)據(jù)Mapper文件的寫法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04JavaWeb response完成重定向?qū)崿F(xiàn)過程詳解
這篇文章主要介紹了JavaWeb response完成重定向?qū)崿F(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Java的Hibernate框架中的組合映射學(xué)習(xí)教程
組合映射即是指主對象和子對象關(guān)聯(lián)且擁有相同的生命周期的映射關(guān)系,這里我們將舉一些數(shù)據(jù)操作的實例,來講解Java的Hibernate框架中的組合映射學(xué)習(xí)教程2016-07-07java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實現(xiàn)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07部署springboot打包不打包配置文件,配置文件為外部配置文件使用詳解
在Spring Boot項目中,將配置文件排除在jar包之外,通過外部配置文件來管理不同環(huán)境的配置,可以實現(xiàn)靈活的配置管理,在pom.xml文件中添加相關(guān)配置,打包時忽略指定文件,運行時在jar包同級目錄下創(chuàng)建config文件夾,將配置文件放入其中即可2025-02-02SpringBoot實現(xiàn)RabbitMQ三種使用方式
本文主要介紹了SpringBoot實現(xiàn)RabbitMQ三種使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07