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

Java中解壓縮文件的方法詳解(通用)

 更新時(shí)間:2024年06月08日 09:10:02   作者:丿BAIKAL巛  
在軟件開(kāi)發(fā)和數(shù)據(jù)處理領(lǐng)域,文件的解壓縮和壓縮是常見(jiàn)的任務(wù),下面這篇文章主要給大家介紹了關(guān)于Java中解壓縮文件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

如何實(shí)現(xiàn)一個(gè)上傳壓縮包,然后將壓縮包進(jìn)行解壓?

下面我們就來(lái)實(shí)現(xiàn)一下這個(gè)代碼。

最終實(shí)現(xiàn)的效果:

上傳一個(gè)壓縮包文件,會(huì)將壓縮包文件下載到本地,然后再將壓縮包解壓到同目錄下的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 允許你打開(kāi)一個(gè) ZIP 文件,并從中讀取內(nèi)容。你可以通過(guò)提供 ZIP 文件的路徑或者 File 對(duì)象來(lái)創(chuàng)建一個(gè) ZipFile 實(shí)例。

  • 訪問(wèn) ZIP 文件中的條目(entries): 一旦你打開(kāi)了一個(gè) ZIP 文件,你可以通過(guò) entries() 方法獲取 ZIP 文件中的所有條目。每個(gè)條目代表 ZIP 文件中的一個(gè)文件或目錄。

  • 提取文件內(nèi)容: 通過(guò) getInputStream() 方法,你可以從 ZIP 文件中提取特定文件的內(nèi)容。這個(gè)方法返回一個(gè) InputStream 對(duì)象,你可以使用它來(lái)讀取文件的數(shù)據(jù)。

  • 關(guān)閉 ZIP 文件: 使用 close() 方法關(guān)閉 ZipFile 實(shí)例,釋放相關(guān)資源。

二、實(shí)際用法

實(shí)際使用的時(shí)候是從前端上傳壓縮包文件,然后后端接收。(具體參考后文Contrller中的完整代碼邏輯)

1、上傳的一般都是MultipartFile類型,需要先將MultipartFile類型轉(zhuǎn)為File類型,使用FileUtils.copyInputStreamToFile這個(gè)方法。

2、轉(zhuǎn)換為File類型時(shí)就需要先將文件存到本地,所以在這里指定了一個(gè)壓縮包的文件路徑File fileTemp = new File("D:\\unzipTest\\Test.zip");

3、使用getAbsolutePath方法來(lái)獲取這個(gè)路徑,將壓縮包的本地路徑傳給fileUncompressing文件解壓縮方法即可完成解壓。

4、在文件解壓縮方法中,會(huì)將文件解壓到D:\\unzipTest\\extracted這個(gè)目錄下,可以自行修改,也可以作為一個(gè)參數(shù)傳進(jìn)去。

我這里解壓縮的時(shí)候獲取了某個(gè)固定文件類型的文件路徑集合,如果需要在解壓縮的時(shí)候做邏輯處理,可以參考。如果只是單純的解壓縮,可以把這個(gè)邏輯刪掉。

        //要下載到的本地臨時(shí)文件路徑
        File fileTemp = new File("D:\\unzipTest\\Test.zip");
        File parentFolder = fileTemp.getParentFile();
        //如果父文件夾(unzipTest)不存在則創(chuàng)建
        if(!parentFolder.exists()){
            //創(chuàng)建父文件夾及其所有上級(jí)文件夾
            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();

            // 打開(kāi)壓縮文件
//            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 {
        //要下載到的本地臨時(shí)文件路徑
        File fileTemp = new File("D:\\unzipTest\\Test.zip");
        File parentFolder = fileTemp.getParentFile();
        //如果父文件夾(unzipTest)不存在則創(chuàng)建
        if(!parentFolder.exists()){
            //創(chuàng)建父文件夾及其所有上級(jí)文件夾
            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();

            // 打開(kāi)壓縮文件
//            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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中synchronized(同步代碼塊和同步方法)詳解及區(qū)別

    java中synchronized(同步代碼塊和同步方法)詳解及區(qū)別

    這篇文章主要介紹了 java中synchronized(同步代碼塊和同步方法)詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringBoot集成Redis流程詳解

    SpringBoot集成Redis流程詳解

    這篇文章主要介紹了SpringBoot集成Redis流程詳解,導(dǎo)入jar包,編寫(xiě)配置類,編寫(xiě)util類,配置yml這四個(gè)步驟,有詳細(xì)的代碼示例,,需要的朋友可以參考下
    2023-05-05
  • Springboot如何設(shè)置過(guò)濾器及重復(fù)讀取request里的body

    Springboot如何設(shè)置過(guò)濾器及重復(fù)讀取request里的body

    這篇文章主要介紹了Springboot如何設(shè)置過(guò)濾器及重復(fù)讀取request里的body,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 2020macOS Big Sur配置Java開(kāi)發(fā)環(huán)境之jdk安裝過(guò)程

    2020macOS Big Sur配置Java開(kāi)發(fā)環(huán)境之jdk安裝過(guò)程

    這篇文章主要介紹了2020macOS Big Sur配置Java開(kāi)發(fā)環(huán)境之jdk安裝,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • springboot整合mybatis實(shí)現(xiàn)簡(jiǎn)單的一對(duì)多級(jí)聯(lián)查詢功能

    springboot整合mybatis實(shí)現(xiàn)簡(jiǎn)單的一對(duì)多級(jí)聯(lián)查詢功能

    這篇文章主要介紹了springboot整合mybatis實(shí)現(xiàn)簡(jiǎn)單的一對(duì)多級(jí)聯(lián)查詢功能,分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java BigDecimal解決double精度丟失的問(wèn)題

    Java BigDecimal解決double精度丟失的問(wèn)題

    我們?cè)谌粘i_(kāi)發(fā)中, 有很多時(shí)候會(huì)遇到小數(shù)(double類型)精確計(jì)算,本文主要介紹了Java BigDecimal解決double精度丟失的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Spring Boot讀取自定義配置文件

    Spring Boot讀取自定義配置文件

    在Spring Boot項(xiàng)目中我們經(jīng)常需要讀取application.yml配置文件的自定義配置,今天就來(lái)羅列一下從yaml讀取配置文件的一些常用手段和方法。
    2021-05-05
  • AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    這篇文章主要為大家介紹了AQS同步組件CyclicBarrier循環(huán)屏障用例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • spring security登錄成功后跳轉(zhuǎn)回登錄前的頁(yè)面

    spring security登錄成功后跳轉(zhuǎn)回登錄前的頁(yè)面

    這篇文章主要介紹了spring security登錄成功后跳轉(zhuǎn)回登錄前的頁(yè)面,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 在springboot中如何使用線程池

    在springboot中如何使用線程池

    在SpringBoot中,可以通過(guò)定義ThreadPoolTaskExecutor的Bean并使用@Autowired注入來(lái)使用線程池,具體步驟包括創(chuàng)建ThreadPoolTaskExecutor的Bean配置,本文給大家介紹springboot使用線程池的例子,感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評(píng)論

定安县| 昌吉市| 临高县| 上栗县| 达拉特旗| 册亨县| 鄂伦春自治旗| 玉田县| 上犹县| 海伦市| 金门县| 翁牛特旗| 兴化市| 呼玛县| 鹤山市| 瓮安县| 景德镇市| 随州市| 双流县| 绥芬河市| 中西区| 余庆县| 鹤峰县| 资中县| 永州市| 扶余县| 镇雄县| 曲阜市| 陕西省| 建阳市| 手游| 唐海县| 抚顺市| 北碚区| 财经| 湾仔区| 洛扎县| 崇信县| 黄龙县| 扶风县| 九江市|