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

Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式

 更新時(shí)間:2024年08月26日 09:04:19   作者:BestTomDoG  
這篇文章主要介紹了Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流

前幾天項(xiàng)目遇到一個(gè)棘手的問(wèn)題,

批量上傳人員的證件照,因?yàn)閖ava操作文件夾不好操作,

最后決定把存放人員證件照的文件夾壓縮成zip文件,

通過(guò)java去解析,然后把里面的文件轉(zhuǎn)成list集合,這里使用的jdk提供的 java.util.zip包

第一步

引入需要的maven依賴

<dependency>
     <groupId>commons-fileupload</groupId>
     <artifactId>commons-fileupload</artifactId>
     <version>1.3.3</version>
</dependency>

第二步

創(chuàng)建UnzipFileVo對(duì)象(文件的載體)

@Data
public class UnzipFileVo {

   
    private MultipartFile file;

}

第三步

編寫轉(zhuǎn)換工具類

public class ZipUtil {

    public static List<UnzipFileVo> Ectract(MultipartFile multipartFile) throws IOException {
        List<UnzipFileVo> list= new ArrayList<>();
        //獲取文件輸入流
        InputStream input = multipartFile.getInputStream();
        //獲取ZIP輸入流(一定要指定字符集Charset.forName("GBK")否則會(huì)報(bào)java.lang.IllegalArgumentException: MALFORMED)
        ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
        ZipFile zf = toFile(multipartFile);
        //定義ZipEntry置為null,避免由于重復(fù)調(diào)用zipInputStream.getNextEntry造成的不必要的問(wèn)題
        ZipEntry ze = null;
        //循環(huán)遍歷
        while ((ze =zipInputStream.getNextEntry())!= null) {
            InputStream is = zf.getInputStream(ze);

            UnzipFileVo unzipFileVo = new UnzipFileVo();
            unzipFileVo.setFile(getMultipartFile(is,ze.getName()));
            list.add(unzipFileVo);
        }
        //一定記得關(guān)閉流
        zipInputStream.closeEntry();
        input.close();
        return list;
    }

    /**
     * 獲取封裝得MultipartFile
     *
     * @param inputStream inputStream
     * @param fileName    fileName
     * @return MultipartFile
     */
    public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
        FileItem fileItem = createFileItem(inputStream, fileName);
        //CommonsMultipartFile是feign對(duì)multipartFile的封裝,但是要FileItem類對(duì)象
        return new CommonsMultipartFile(fileItem);
    }

    private  static  ZipFile toFile(MultipartFile multipartFile) throws IOException {
        if (multipartFile == null || multipartFile.getSize() <= 0) {
            return null;
        }
        File file = multipartFileToFile(multipartFile);
        if (file == null || !file.exists()) {
            return null;
        }
        ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
        return zipFile;
    }

    private static File multipartFileToFile(MultipartFile multipartFile) {
        File file = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = multipartFile.getInputStream();
            file = new File(multipartFile.getOriginalFilename());
            outputStream = new FileOutputStream(file);
            write(inputStream, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }

    public static void  write(InputStream inputStream, OutputStream outputStream) {
        byte[] buffer = new byte[4096];
        try {
            int count = inputStream.read(buffer, 0, buffer.length);
            while (count != -1) {
                outputStream.write(buffer, 0, count);
                count = inputStream.read(buffer, 0, buffer.length);
            }
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * FileItem類對(duì)象創(chuàng)建
     *
     * @param inputStream inputStream
     * @param fileName    fileName
     * @return FileItem
     */
    public static FileItem createFileItem(InputStream inputStream, String fileName) {
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        String textFieldName = "file";
        FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        OutputStream os = null;
        //使用輸出流輸出輸入流的字節(jié)
        try {
            os = item.getOutputStream();
            while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            inputStream.close();
        } catch (IOException e) {

            throw new IllegalArgumentException("文件上傳失敗");
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {

                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                }
            }
        }

        return item;
    }
}

第四步

調(diào)用工具

   @PostMapping("/UploadManagerPhoto")
    public ActionResult uploadManagerPhoto(MultipartFile file) throws IOException {
        if(Objects.isNull(file) || file.isEmpty()) {//驗(yàn)證文件是否為空
            return ActionResult.fail("上傳文件為空或不存在");
        }
        List<UnzipFileVo> unzipFileVoList = UnZipUtil.Ectract(file);
        List<UnzipFileVo> collect = unzipFileVoList.stream().filter(item -> item.getFile().getOriginalFilename().contains(".") && item.getFile().getSize() > 0).collect(Collectors.toList());//獲取zip文件里面的文件,并組裝到新的List對(duì)象//過(guò)濾文件夾
        //上面就是把zip壓縮包的內(nèi)容轉(zhuǎn)換稱了文件流集合,下面可根據(jù)自己的業(yè)務(wù)對(duì)文件進(jìn)行操作
        int sum = 0;
        for (int i = 0; i < collect.size(); i++) {
            //這是我自己封裝的上傳方法,大家可以根據(jù)自己的實(shí)際情況對(duì)文件進(jìn)行操作
            UploaderVO uploaderVO = fileService.uploader("document", collect.get(i).getFile());//調(diào)取上傳方法,返回上傳成功對(duì)象
            sum++;
        }
        return ActionResult.success("解析zip成功,成功上傳"+sum+"條數(shù)據(jù)");
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java面向?qū)ο笾饔糜蛟敿?xì)解讀

    Java面向?qū)ο笾饔糜蛟敿?xì)解讀

    這篇文章主要介紹了Java面向?qū)ο笾饔糜蛟敿?xì)解讀,在java編程中,主要的變量就是屬性和局部變量,局部變量一般是指在成員方法中定義的變量,局部變量也就是除了屬性之外的其他變量,作用域?yàn)槎x他的代碼塊中,需要的朋友可以參考下
    2024-01-01
  • 詳解Java爬蟲利器Jsoup

    詳解Java爬蟲利器Jsoup

    Jsoup是一款Java語(yǔ)言開發(fā)的HTML解析器,用于解析HTML文檔以及對(duì)HTML文檔進(jìn)行操作,處理等,本文就將詳細(xì)給大家介紹一下Java中的爬蟲利器Jsoup,感興趣的同學(xué)可以參考一下
    2023-06-06
  • Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    本篇文章,小編將為大家介紹關(guān)于Struts2開發(fā) 基本配置與類型轉(zhuǎn)換,有需要的朋友可以參考一下
    2013-04-04
  • Java(springboot) 讀取txt文本內(nèi)容代碼實(shí)例

    Java(springboot) 讀取txt文本內(nèi)容代碼實(shí)例

    這篇文章主要介紹了Java(springboot) 讀取txt文本內(nèi)容代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java實(shí)現(xiàn)分頁(yè)查詢功能

    Java實(shí)現(xiàn)分頁(yè)查詢功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)分頁(yè)查詢功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • SpringBoot日志框架如何使用

    SpringBoot日志框架如何使用

    這篇文章主要介紹了SpringBoot日志框架如何使用,幫助大家更好的理解和使用springboot日志框架,感興趣的朋友可以了解下
    2021-01-01
  • IntelliJ?IDEA導(dǎo)出WAR包詳細(xì)過(guò)程

    IntelliJ?IDEA導(dǎo)出WAR包詳細(xì)過(guò)程

    這篇文章主要介紹了IntelliJ?IDEA導(dǎo)出WAR包全指南,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2026-01-01
  • java String源碼和String常量池的全面解析

    java String源碼和String常量池的全面解析

    下面小編就為大家分享一篇java String源碼和String常量池的全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開發(fā)的應(yīng)用詳解

    SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開發(fā)的應(yīng)用詳解

    這篇文章主要介紹了SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開發(fā)的應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 最好的8個(gè)Java RESTful框架

    最好的8個(gè)Java RESTful框架

    最好的8個(gè)Java RESTful框架,需要的朋友可以參考下
    2016-05-05

最新評(píng)論

麻栗坡县| 浮山县| 利津县| 南乐县| 丁青县| 沛县| 略阳县| 阳谷县| 澄迈县| 仁化县| 社会| 彭水| 宁阳县| 沈丘县| 宿迁市| 绥滨县| 周宁县| 宝丰县| 静乐县| 宁蒗| 日土县| 平湖市| 庆安县| 合江县| 罗江县| 栾川县| 洛阳市| 鹤壁市| 泗洪县| 丘北县| 远安县| 延庆县| 松江区| 唐河县| 巴彦县| 达州市| 济阳县| 奉化市| 佛坪县| 克山县| 灌云县|