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压缩包的资料请关注脚本之家其它相关文章!

相关文章

  • Spring FreeMarker整合Struts2过程详解

    Spring FreeMarker整合Struts2过程详解

    这篇文章主要介绍了Spring FreeMarker整合Struts2过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • JAVA提高第十篇 ArrayList深入分析

    JAVA提高第十篇 ArrayList深入分析

    这篇文章主要深入分析了JAVA提高第十篇ArrayList的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java实现图片切割功能

    Java实现图片切割功能

    这篇文章主要为大家详细介绍了Java实现图片切割功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Spring中如何使用@Value注解实现给Bean属性赋值

    Spring中如何使用@Value注解实现给Bean属性赋值

    这篇文章主要介绍了Spring中如何使用@Value注解实现给Bean属性赋值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 解析Mybatis的insert方法返回数字-2147482646的解决

    解析Mybatis的insert方法返回数字-2147482646的解决

    这篇文章主要介绍了解析Mybatis的insert方法返回数字-2147482646的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java异常机制分析

    java异常机制分析

    这篇文章主要介绍了java异常机制,包括异常机制的捕获、抛出及常见的异常机制总结,需要的朋友可以参考下
    2014-09-09
  • java整合onlyoffice的各种踩坑记录

    java整合onlyoffice的各种踩坑记录

    这篇文章主要给大家介绍了关于java整合onlyoffice的各种踩坑,OnlyOffice是一种强大的在线协作软件,专为企业和个人设计,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • springboot集成mybatis-plus遇到的问题及解决方法

    springboot集成mybatis-plus遇到的问题及解决方法

    这篇文章主要介绍了springboot集成mybatis-plus遇到的问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java WSDL接口webService实现方式

    java WSDL接口webService实现方式

    这篇文章主要为大家详细介绍了java WSDL接口webService实现方式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • JAVA TIMER简单用法学习

    JAVA TIMER简单用法学习

    Timer类是用来执行任务的类,它接受一个TimerTask做参数
    2013-07-07

最新评论