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

 更新时间:2022年07月21日 16:48:49   作者:zyqok  
这篇文章主要为大家详细介绍了如何利用Java语言实现页面上传一个源码压缩包,后端将压缩包解压,并获取每个文件中的内容,感兴趣的可以动手尝试一下

功能描述

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

相关源码

(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 进行接口测试,解析的结果如下。

以上就是Java实现解析zip压缩包并获取文件内容的详细内容,更多关于Java解析zip压缩包的资料请关注脚本之家其它相关文章!

相关文章

  • idea启动与jar包启动中使用resource资源文件路径的问题

    idea启动与jar包启动中使用resource资源文件路径的问题

    这篇文章主要介绍了idea启动与jar包启动中使用resource资源文件路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Mybatis-Plus insertBatch执行缓慢的原因查询

    Mybatis-Plus insertBatch执行缓慢的原因查询

    这篇文章主要介绍了Mybatis-Plus insertBatch执行缓慢的原因查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java工具类DateUtils实例详解

    Java工具类DateUtils实例详解

    这篇文章主要为大家详细介绍了Java工具类DateUtils实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java正则匹配读取txt文件提取特定开头和结尾的字符串

    java正则匹配读取txt文件提取特定开头和结尾的字符串

    通常我们可以直接通过文件流来读取txt文件的内容,但有时候也会遇到问题,下面这篇文章主要给大家介绍了关于java正则匹配读取txt文件提取特定开头和结尾的字符串的相关资料,需要的朋友可以参考下
    2022-11-11
  • java面向对象的三大特性之一继承用法实例分析

    java面向对象的三大特性之一继承用法实例分析

    这篇文章主要介绍了java面向对象的三大特性之一继承用法,结合实例形式分析了java面向对象程序设计中继承的基本原理与具体使用方法,需要的朋友可以参考下
    2019-11-11
  • mybatis 延迟加载的深入理解

    mybatis 延迟加载的深入理解

    这篇文章主要介绍了mybatis 延迟加载的深入理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 多用多学之Java中的Set,List,Map详解

    多用多学之Java中的Set,List,Map详解

    下面小编就为大家带来一篇多用多学之Java中的Set,List,Map详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Mybatis-Spring源码分析图解

    Mybatis-Spring源码分析图解

    这篇文章主要介绍了Mybatis-Spring源码分析,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Java由浅入深细数数组的操作下

    Java由浅入深细数数组的操作下

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素
    2022-04-04
  • java中如何获取线程名称

    java中如何获取线程名称

    这篇文章主要介绍了java中如何获取线程名称问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论