首页 > 文章列表 > Java实现解析zip文件获取文件内容的方法

Java实现解析zip文件获取文件内容的方法

java zip
333 2023-04-29

Java如何实现解析zip压缩包并获取文件内容

功能描述

页面上传一个源码压缩包,后端将压缩包解压,并获取每个文件中的内容。

相关源码

(1)首先定义一个与解压文件对应的实体类。

package com.sonar.data.vo;

 

import lombok.Data;

 

/**

 * 文件解析对象

 *

 * @author Yuanqiang.Zhang

 * @since 2022/7/12

 */

@Data

public class UnzipFileVo {

 

    /**

     * 类型:0-文件夹;1-文件

     */

    private Integer type;

 

    /**

     * 文件路径(如:src/main/java/com/zyq/entity/User.java)

     */

    private String path;

 

    /**

     * 文件内容

     */

    private String content;

 

}

(2)接下来就是解压的工具类了。

package com.sonar.data.utils.business;

 

import com.sonar.data.vo.UnzipFileVo;

import org.springframework.web.multipart.MultipartFile;

 

import java.io.*;

import java.util.*;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

 

/**

 * 解析文件工具类

 *

 * @author Yuanqiang.Zhang

 * @since 2022/7/12

 */

@SuppressWarnings("unused")

public class UnZipUtils {

 

    public static int BYTE_LEN = 10240;

 

    /**

     * 本地文件解压

     *

     * @param file 具体文件

     * @return 解压后的文件列表

     */

    public static List<UnzipFileVo> unzip(File file) {

        if (Objects.isNull(file) || !file.exists()) {

            return Collections.emptyList();

        }

        ZipFile zip = null;

        try {

            zip = new ZipFile(file);

        } catch (IOException e) {

            e.printStackTrace();

        }

        if (Objects.isNull(zip)) {

            return Collections.emptyList();

        }

        Enumeration<? extends ZipEntry> entries = zip.entries();

        List<UnzipFileVo> vos = new ArrayList<>();

        while (entries.hasMoreElements()) {

            ZipEntry entry = entries.nextElement();

            String path = entry.getName();

            UnzipFileVo vo = new UnzipFileVo();

            vo.setPath(path);

            // 解析文件夹

            boolean directory = entry.isDirectory();

            if (directory) {

                vo.setType(0);

                vos.add(vo);

                continue;

            }

            // 解析文件

            vo.setType(1);

            StringBuilder sb = new StringBuilder();

            try (InputStream in = zip.getInputStream(entry);

                 InputStreamReader inputStreamReader = new InputStreamReader(in);

                 BufferedReader reader = new BufferedReader(inputStreamReader)) {

                String line;

                while ((line = reader.readLine()) != null) {

                    sb.append(line).append("\n");

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            vo.setContent(sb.toString());

            vos.add(vo);

        }

        if (Objects.nonNull(zip)) {

            try {

                zip.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        return vos;

    }

 

 

    /**

     * 上传文件解压

     *

     * @param multipartFile 上传文件

     * @return 解压后的文件列表

     */

    public static List<UnzipFileVo> unzip(MultipartFile multipartFile) {

        File file = getFile(multipartFile);

        if (Objects.isNull(file)) {

            return Collections.emptyList();

        }

        List<UnzipFileVo> vos = unzip(file);

        if (file.exists()) {

            boolean delete = file.delete();

            if (delete) {

                System.out.println(file.getName() + " 临时文件删除成功!");

            } else {

                System.out.println(file.getName() + " 临时文件删除失败!");

            }

        }

        return vos;

    }

 

    /**

     * MultipartFile 转 File

     *

     * @param multipartFile 上传文件

     * @return 本地文件

     */

    private static File getFile(MultipartFile multipartFile) {

        String fileName = System.currentTimeMillis() + "_" + multipartFile.getOriginalFilename();

        File file = new File("D://" + fileName);

        int len;

        try (OutputStream os = new FileOutputStream(file);

             InputStream in = multipartFile.getInputStream()) {

            byte[] buffer = new byte[BYTE_LEN];

            while ((len = in.read(buffer, 0, BYTE_LEN)) != -1) {

                os.write(buffer, 0, len);

            }

        } catch (IOException e) {

            e.printStackTrace();

            return null;

        }

        return file;

    }

}

调用说明

工具类中提供了两个解压的方式:

方式一:本地文件 File 进行解压。

方式二:上传文件 MultipartFile 进行解压。

package com.sonar.data.controller;

 

import com.sonar.data.utils.business.UnZipUtils;

import com.sonar.data.vo.UnzipFileVo;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestPart;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.multipart.MultipartFile;

 

import java.io.File;

import java.util.List;

 

/**

 * @author Yuanqiang.Zhang

 * @since 2022/7/8

 */

@RestController

@RequestMapping("/test")

public class TestController {

 

    /**

     * 上传文件解压(示例)

     */

    @PostMapping("/import")

    public List<UnzipFileVo> importTest(@RequestPart("file") MultipartFile mFile) {

        return UnZipUtils.unzip(mFile);

    }

 

    /**

     * 本地文件解压(示例)

     */

    public static void main(String[] args) {

        File file = new File("src.zip");

        boolean delete = file.delete();

        System.out.println(delete);

    }

 

}

测试效果

我们以上传压缩包解析为例,通过 Postman 进行接口测试,解析的结果如下。