欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)解壓zip壓縮包的兩種方法(支持多層級)

 更新時間:2024年03月11日 15:21:01   作者:Dream_sky分享  
壓縮文件在生活中經(jīng)常能用到,在Java中提供了壓縮和解壓縮文件的功能,本文主要介紹了Java實現(xiàn)解壓zip壓縮包的兩種方法(支持多層級),感興趣的可以了解一下

前言

當(dāng)我們需要上傳大量文件時,壓縮文件可以大大減少傳輸時間和網(wǎng)絡(luò)帶寬,在Java中提供了壓縮和解壓縮文件的功能,可以使用java.util.zip包中的類來實現(xiàn)。但是也有很多不足, 本篇將對如何使用 Java 實現(xiàn)解壓縮進(jìn)行簡單總結(jié)。

  • ZIP :最常見的壓縮文件格式之一,可以存儲一個或多個文件,并可在不同的操作系統(tǒng)中進(jìn)行解壓縮。

一、使用ZipInputStream解壓文件流(不支持中文)

public static List<File>  unzipInputStream(InputStream zipInputStream) {
        List<File> fileList = new ArrayList<>();
        try (ZipInputStream zip = new ZipInputStream(zipInputStream)) {
            ZipEntry zipEntry = null;
            while ((zipEntry = zip.getNextEntry()) != null) {
                String fileName_zip = zipEntry.getName();
                File file = new File(fileName_zip);
                if (fileName_zip.endsWith("/")) {
                    file.mkdir();
                    continue;
                } else {
                    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
                    byte[] byte_s = new byte[1024];
                    int num;
                    while ((num = zip.read(byte_s, 0, byte_s.length)) > 0) {
                        outputStream.write(byte_s, 0, num);
                    }
                    outputStream.close();
                }
                fileList.add(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileList;
    }

在調(diào)用JDK自帶的zipfile讀取壓縮包文件的時候,出現(xiàn)了以下錯誤: MALFORMED

java.lang.IllegalArgumentException: MALFORMED
    at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
    at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:300)
    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)
    at com.wonder.meta.util.ZipUtils.unzipInputStream(ZipUtils.java:26)

1.1 原因描述

后來經(jīng)過檢查,發(fā)現(xiàn)壓縮包內(nèi)有一個文件的名字帶有中文,解析壓縮包中,讀取中文文件導(dǎo)致報錯

由于操作系統(tǒng)平臺的差異,導(dǎo)致zip壓縮包的編碼格式不同,windows默認(rèn)使用GB2312格式,mac和linux默認(rèn)使用utf-8格式,造成這種現(xiàn)象的原因有幾種可能:

  • 壓縮包中包含中文
  • 在linux上壓縮,在windows上使用解壓工具解壓
  • 使用jdk api直接解壓

1.2 解決方案

推薦使用(經(jīng)過測試)Apache commons-compress 工具包解決跨平臺編碼問題

二、使用ZipArchiveInputStream解壓(推薦)

2.1 引入pom依賴

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.21</version>
        </dependency>

ZipInputStream 和 ZipArchiveInputStream 都是 Java 中用于處理 Zip 文件的類,但是它們之間有一些區(qū)別。

  • ZipInputStream 是 Java 標(biāo)準(zhǔn)庫中提供的類,而 ZipArchiveInputStream 是 Apache Commons Compress 庫中提供的類。

  • ZipInputStream 只能讀取普通的 Zip 文件,而 ZipArchiveInputStream 支持讀取多種壓縮格式,包括 Zip、Gzip、Tar、Jar 等。

  • ZipArchiveInputStream 提供了更多的選項和功能,例如可以設(shè)置編碼方式、支持密碼保護(hù)的 Zip 文件等。

  • ZipArchiveInputStream 的性能比 ZipInputStream 更好,在處理大型 Zip 文件時表現(xiàn)更出色。

2.2 進(jìn)行改造后

    public static List<File>  unzipInputStream(InputStream zipInputStream) {
        List<File> fileList = new ArrayList<>();
        try (ZipArchiveInputStream zip = new ZipArchiveInputStream(zipInputStream)) {
            ZipArchiveEntry zipEntry = null;
            while ((zipEntry = zip.getNextZipEntry()) != null) {
                String fileName_zip = zipEntry.getName();
                File file = new File(fileName_zip);
                if (fileName_zip.endsWith("/")) {
                    file.mkdir();
                    continue;
                } else {
                    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
                    byte[] byte_s = new byte[1024];
                    int num;
                    while ((num = zip.read(byte_s, 0, byte_s.length)) > 0) {
                        outputStream.write(byte_s, 0, num);
                    }
                    outputStream.close();
                }
                fileList.add(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileList;
    }

測試正常

三、整理為工具類

  • 包含獲取目錄下的圖片…(包括子目錄)
  • 定義文件過濾器(過濾想留下的文件)

3.1 ZipUtils

public class ZipUtils {

    public static List<File>  unzipInputStream(InputStream zipInputStream) {
        List<File> fileList = new ArrayList<>();
        try (ZipArchiveInputStream zip = new ZipArchiveInputStream(zipInputStream)) {
            ZipArchiveEntry zipEntry = null;
            while ((zipEntry = zip.getNextZipEntry()) != null) {
                String fileName_zip = zipEntry.getName();
                File file = new File(fileName_zip);
                if (fileName_zip.endsWith("/")) {
                    file.mkdir();
                    continue;
                } else {
                    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
                    byte[] byte_s = new byte[1024];
                    int num;
                    while ((num = zip.read(byte_s, 0, byte_s.length)) > 0) {
                        outputStream.write(byte_s, 0, num);
                    }
                    outputStream.close();
                }
                fileList.add(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileList;
    }


    // 單獨列出方法獲取目錄下的圖片
    public static List<File> listAll(File parent) {
        List<File> fileList = new ArrayList<>();
        MyFilter myFilter = new MyFilter();
        File[] children = parent.listFiles(myFilter);
        if(children != null){
            for (int i = 0; i < children.length; i++) {
                // 如果子文件是個文件夾,則遞歸調(diào)用
                if (!children[i].isFile()) {
                    listAll(children[i]);
                } else {
                    fileList.add(children[i]);
                }
            }
        }
        return fileList;
    }

    //定義文件過濾器
    static class MyFilter implements FilenameFilter {
        @Override
        public boolean accept(File dir, String name) {
            return name.contains(".png") || dir.isDirectory();
        }
    }
}

3.2 這里列出實現(xiàn)類的方法作為參考

記得刪除臨時文件

	@Override
    public void batchUploadSign(MultipartFile multipartFile) {
        List<File> fileList = null;
        try {
            fileList = ZipUtils.unzipInputStream(multipartFile.getInputStream());
            //fileList可能存在目錄
            for (File fileTemp : fileList) {
                List<File> fileTempList = ZipUtils.listAll(fileTemp);
                if (CollectionUtil.isNotEmpty(fileTempList)) {
                    fileList.addAll(fileTempList);
                }
            }
            if (CollectionUtil.isNotEmpty(fileList)) {
                log.info("省略業(yè)務(wù)邏輯");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //刪除臨時文件
            if (null != fileList) {
                for (File file1 : fileList) {
                    file1.delete();
                }
            }
        }
    }

 到此這篇關(guān)于Java實現(xiàn)解壓zip壓縮包的兩種方法(支持多層級)的文章就介紹到這了,更多相關(guān)Java 解壓zip壓縮包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Date日期時間類具體使用

    Java中Date日期時間類具體使用

    本文主要介紹了Java中Date日期時間類具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java實現(xiàn)簡單訂餐系統(tǒng)

    Java實現(xiàn)簡單訂餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡單訂餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺談Java中真的只有值傳遞么

    淺談Java中真的只有值傳遞么

    這篇文章主要介紹了淺談Java中真的只有值傳遞么?文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 日志模塊自定義@SkipLogAspect注解跳過切面的操作方法

    日志模塊自定義@SkipLogAspect注解跳過切面的操作方法

    文章介紹了一個自定義注解@SkipLogAspect,用于在日志模塊中跳過特定方法的日志切面,這個注解可以用于需要避免大對象轉(zhuǎn)換為JSON時導(dǎo)致的OOM問題,文章還提供了注解的實現(xiàn)代碼以及一個測試示例,展示了如何在控制器中使用該注解來跳過日志切面,感興趣的朋友一起看看吧
    2025-02-02
  • idea中使用maven?archetype新建項目時卡住問題解決方案

    idea中使用maven?archetype新建項目時卡住問題解決方案

    這篇文章主要介紹了idea中使用maven?archetype新建項目時卡住,解決本問題的方法,就是在maven的runner加上參數(shù)-DarchetypeCatalog=local就可以了,不需要下載xml文件再放到指定目錄,需要的朋友可以參考下
    2023-08-08
  • java抓取網(wǎng)頁數(shù)據(jù)示例

    java抓取網(wǎng)頁數(shù)據(jù)示例

    要通java獲取整個網(wǎng)頁的html內(nèi)容,或者某個網(wǎng)絡(luò)文件的內(nèi)容,可以使用java提供的HttpURLConnection類來實現(xiàn)對網(wǎng)頁內(nèi)容的抓取
    2014-03-03
  • Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解

    Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解

    這篇文章主要介紹了Java中l(wèi)ombok的@Builder注解的解析與簡單使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot+Redis海量重復(fù)提交問題解決

    SpringBoot+Redis海量重復(fù)提交問題解決

    在實際的開發(fā)項目中,一個對外暴露的接口往往會面臨很多次請求,所以本文介紹一下SpringBoot+Redis海量重復(fù)提交問題解決,感興趣的可以了解一下
    2023-12-12
  • SpringBoot集成slf4j2日志配置的實現(xiàn)示例

    SpringBoot集成slf4j2日志配置的實現(xiàn)示例

    本文主要介紹了SpringBoot集成slf4j2日志配置的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Springboot基礎(chǔ)之RedisUtils工具類

    Springboot基礎(chǔ)之RedisUtils工具類

    本文來說下RedisUtils工具類,主要介紹了整合Redis、MyBatis,封裝RedisUtils工具類等知識,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05

最新評論