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

Java操作壓縮包解壓過(guò)程詳解

 更新時(shí)間:2024年10月03日 11:37:17   作者:Satan712  
這篇文章主要介紹了Java操作壓縮包解壓過(guò)程,項(xiàng)目開發(fā)中,總會(huì)遇到解壓縮文件的時(shí)候,比如用戶下載多個(gè)文件時(shí),服務(wù)端可以將多個(gè)文件壓縮成一個(gè)文件,用戶上傳資料時(shí),允許上傳壓縮文件,服務(wù)端進(jìn)行解壓讀取每一個(gè)文件,使用場(chǎng)景是很多的,下面來(lái)詳細(xì)講解,需要的朋友可以參考下

在Java開發(fā)中,處理壓縮文件(如ZIP、RAR等)是一項(xiàng)常見的任務(wù),特別是在需要處理大量數(shù)據(jù)、備份或分發(fā)應(yīng)用程序時(shí)。Java標(biāo)準(zhǔn)庫(kù)(Java SE)提供了對(duì)ZIP格式的原生支持,通過(guò)java.util.zip包中的類來(lái)實(shí)現(xiàn)壓縮和解壓功能。本文將重點(diǎn)介紹如何使用Java來(lái)解壓ZIP或RAR壓縮包。

一、解壓壓縮包

解壓壓縮包,借助ZipInputStream類,可以讀取到壓縮包中的每一個(gè)文件,然后根據(jù)讀取到的文件屬性,寫入到相應(yīng)路徑下即可。對(duì)于解壓壓縮包中是文件樹的結(jié)構(gòu),每讀取到一個(gè)文件后,如果是多層路徑下的文件,需要先創(chuàng)建父目錄,再寫入文件流。

1.zip解壓代碼實(shí)現(xiàn)

// 解壓zip格式
    public static void unzip(String path){
        // 根據(jù)原始路徑(字符串),創(chuàng)建源文件(File對(duì)象)
        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工具類進(jìn)行刪除
            try {
                FileUtils.deleteDirectory(rootDir);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 創(chuàng)建根目錄
        rootDir.mkdirs();
        // System.out.println(rootDir);
        // ZipInputStream:用于進(jìn)行zip格式的壓縮文件輸入流
        try (ZipInputStream in  = new ZipInputStream(new FileInputStream(sourceFile))) {
            // 遍歷壓縮包中的每個(gè)子目錄或子文件(ZipEntry類型的對(duì)象)
            ZipEntry zipEntry = null;
            while((zipEntry = in.getNextEntry()) != null){
                // System.out.println(zipEntry.getName());
                // 創(chuàng)建子目錄或子文件(File對(duì)象)
                // 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)前壓縮包中的子文件,并通過(guò)輸出流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解壓代碼實(shí)現(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對(duì)象,用于讀取rar壓縮文件格式
        try(Archive archive = new Archive(new FileInputStream(path))) {
            // 讀取壓縮文件中的所有子目錄或子文件(FileHeader對(duì)象)
            List<FileHeader> fileHeaderList = archive.getFileHeaders();
            // 按照子目錄(子文件)名來(lái)排序
            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\\實(shí)驗(yàn)案例.rar";
        if(path.endsWith(".zip")) {
            unzip(path);
        } else if(path.endsWith(".rar")){
            unrar(path);
        }
    }
 

二、注意事項(xiàng)

  • 文件路徑處理:在解壓時(shí),注意正確處理ZIP文件中的文件路徑,以避免安全風(fēng)險(xiǎn)(如路徑遍歷攻擊)。
  • 異常處理:在解壓過(guò)程中,可能會(huì)遇到文件讀取錯(cuò)誤、寫入錯(cuò)誤或權(quán)限問(wèn)題,應(yīng)妥善處理這些異常。
  • 性能優(yōu)化:對(duì)于大型ZIP文件,考慮使用更高效的IO操作和流控制來(lái)優(yōu)化解壓速度。
  • 壓縮用到的JAR包:需要使用第三方庫(kù),如commons-io包。

三、總結(jié)

  • 在解壓縮文件過(guò)程中,主要是對(duì)流的讀取操作,注意進(jìn)行異常處理,以及關(guān)閉流。
  • 解壓縮文件時(shí),注意空文件夾的處理。

到此這篇關(guān)于Java操作壓縮包解壓過(guò)程詳解的文章就介紹到這了,更多相關(guān)Java壓縮包解壓內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多文件以ZIP壓縮包導(dǎo)出的實(shí)現(xiàn)方法

    Java多文件以ZIP壓縮包導(dǎo)出的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了Java多文件以ZIP壓縮包導(dǎo)出的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java 加密解密基礎(chǔ)分類及模式歸納整理

    Java 加密解密基礎(chǔ)分類及模式歸納整理

    這篇文章主要介紹了Java加密解密基礎(chǔ)分類方法匯總的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • java集合迭代器Iterator中的remove陷阱

    java集合迭代器Iterator中的remove陷阱

    這篇文章主要介紹了java集合迭代器Iterator中的remove陷阱,需要的朋友可以參考下
    2016-04-04
  • Java多線程知識(shí)點(diǎn)全面總結(jié)

    Java多線程知識(shí)點(diǎn)全面總結(jié)

    這篇文章主要介紹了Java多線程知識(shí)點(diǎn)全面總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java?定時(shí)任務(wù)技術(shù)趨勢(shì)詳情

    Java?定時(shí)任務(wù)技術(shù)趨勢(shì)詳情

    這篇文章主要介紹了Java?定時(shí)任務(wù)技術(shù)趨勢(shì)詳情,定時(shí)任務(wù)是每個(gè)業(yè)務(wù)常見的需求,比如每分鐘掃描超時(shí)支付的訂單,每小時(shí)清理一次數(shù)據(jù)庫(kù)歷史數(shù)據(jù),每天統(tǒng)計(jì)前一天的數(shù)據(jù)并生成報(bào)表等,下文更多相關(guān)資料,需要的小伙伴可以參考一下
    2022-05-05
  • Spring Boot自定義注解從入門到實(shí)戰(zhàn)指南

    Spring Boot自定義注解從入門到實(shí)戰(zhàn)指南

    本文介紹了SpringBoot中自定義注解的設(shè)計(jì)、實(shí)現(xiàn)與應(yīng)用技巧,涵蓋了注解基礎(chǔ)、創(chuàng)建自定義注解、注解處理器實(shí)現(xiàn)方案、高級(jí)注解特性、性能優(yōu)化與最佳實(shí)踐、實(shí)戰(zhàn)案例、測(cè)試策略、常見問(wèn)題與解決方案以及總結(jié)與最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 2025漢化idea創(chuàng)建JSP項(xiàng)目全過(guò)程

    2025漢化idea創(chuàng)建JSP項(xiàng)目全過(guò)程

    文章介紹了如何在IntelliJ IDEA中創(chuàng)建和配置一個(gè)Java Web項(xiàng)目,包括創(chuàng)建項(xiàng)目、配置Web項(xiàng)目、配置Tomcat服務(wù)器以及創(chuàng)建一個(gè)簡(jiǎn)單的JSP文件
    2025-11-11
  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    這篇文章主要介紹了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 完美解決Eclipse導(dǎo)入的項(xiàng)目上有個(gè)紅叉,但不影響項(xiàng)目運(yùn)行的問(wèn)題

    完美解決Eclipse導(dǎo)入的項(xiàng)目上有個(gè)紅叉,但不影響項(xiàng)目運(yùn)行的問(wèn)題

    這篇文章主要介紹了完美解決Eclipse導(dǎo)入的項(xiàng)目上有個(gè)紅叉,但不影響項(xiàng)目運(yùn)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Java多線程死鎖問(wèn)題詳解(wait和notify)

    Java多線程死鎖問(wèn)題詳解(wait和notify)

    線程之間形成相互等待資源的環(huán)時(shí),就會(huì)形成順序死鎖,下面這篇文章主要給大家介紹了關(guān)于Java多線程死鎖問(wèn)題(wait和notify)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

铜山县| 图木舒克市| 始兴县| 新邵县| 衢州市| 浦城县| 固安县| 无为县| 霸州市| 崇明县| 赤水市| 泰州市| 新密市| 积石山| 图木舒克市| 工布江达县| 惠水县| 东乌珠穆沁旗| 望谟县| 岳西县| 弥渡县| 宣恩县| 许昌县| 新绛县| 吉首市| 余姚市| 邹城市| 民丰县| 应城市| 乌拉特后旗| 赤壁市| 乌鲁木齐市| 珲春市| 襄汾县| 延安市| 宜川县| 达拉特旗| 朔州市| 永昌县| 泌阳县| 青浦区|