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

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

(0)

相关推荐

  • Java实现文件压缩为zip和解压zip压缩包

    目录 压缩成.zip 解压.zip 压缩成.zip 代码如下: /** * 压缩成ZIP * * @param srcDir 压缩文件夹路径 * @param out 压缩文件输出流 * @throws RuntimeException 压缩失败会抛出运行时异常 */ public static void toZip(String srcDir, OutputStream out) throws RuntimeException { long start = System.currentTime

  • Java8 Zip 压缩与解压缩的实现

    网上找过几个例子都有点小问题,还是谷歌找出来的靠谱.主要是增加了指定文件的功能,通过 Java8 的 Lambda 判断是否加入 ZIP 压缩,比较方便.函数表达式的签名是 Function<File, Boolean>,参数是待加入的 File 对象,返回值 true 表示允许,反之不行. 完整代码在:https://gitee.com/sp42_admin/ajaxjs/blob/master/ajaxjs-base/src/main/java/com/ajaxjs/util/io/Fil

  • 如何基于java实现解压ZIP TAR等文件

    java实现对常用.ZIP , .TAR, .TAR.BZ2, .BZ2 ,.TAR.GZ ,.GZ格式文件的解压. 首先需要引入maven依赖,这里使用的是Apache的压缩工具包common-compress,改工具包支持解压.压缩,此代码中我列举出一个zip的压缩示例,其他格式的只需切换改格式对应的流即可. 对于RAR格式文件的解压,目前该工具包还不支持,希望大家做过的可以多多交流. <dependency> <groupId>org.apache.commons</g

  • 用Java进行zip文件压缩与解压缩

    可能存在的业务情况: 1.用户上传了压缩包,需校验压缩包中的文件是否合格. 2.用户上传压缩包,对压缩包中的文件进行批量水印处理 解决思路: 1.读取原压缩包文件,解压缩至临时目录 2.对临时目录中的解压缩文件进行校验/水印处理 3.对临时目录中处理过的文件进行压缩 4.删除临时目录及其下的文件 需要参考前面的校验PDF的帖子 测试结果如下: 测试代码: @Test public void testZip() { String filePath = "D:\\pdfTest\\合格压缩文件.zi

  • Java实现的zip工具类完整实例

    本文实例讲述了Java实现的zip工具类.分享给大家供大家参考,具体如下: 实现把zip解压到指定路径,把文件夹压缩到zip,把文件列表压缩为zip的三个方法 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

  • Java如何不解压读取.zip的文件内容

    前言 最近项目中需要拿到.zip文件中的文件内容,之前的做法是先解压到某个目录然后在对里面的文件进行处理,后面发现其实可以不用这么做,jdk中自带的包就可以解决这个问题. 示例如下: public static void main(String[] args) throws IOException { //获取文件输入流 FileInputStream input = new FileInputStream("C:\\Users\\admin\\Desktop\\test.zip");

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

    目录 功能描述 相关源码 调用说明 测试效果 功能描述 页面上传一个源码压缩包,后端将压缩包解压,并获取每个文件中的内容. 相关源码 (1)首先定义一个与解压文件对应的实体类. package com.sonar.data.vo; import lombok.Data; /** * 文件解析对象 * * @author Yuanqiang.Zhang * @since 2022/7/12 */ @Data public class UnzipFileVo { /** * 类型:0-文件夹:1-文

  • Java实现创建Zip压缩包并写入文件

    前言 工作中需要把一些数据放到一个zip的压缩包中,可以使用 ZipOutputStream.ZipOutputStream可以将内容直接写入到zip包中.一般创建ZipOutputStream通常是先封装一个FileOutputStream,然后在每写入一个文件之前,需要先调用一次putNextEntry,然后使用write写入byte[]类型的数据,当写入完毕的时候使用colseEntry来结束这个文件的打包.当然也可以通过ZipOutputStream直接把数据写入压缩包内,在压缩包内构建

  • Java实现导出ZIP压缩包的方法

    最近接触到一个需求要求压缩导出文件,于是乎便要致力于研究一下工具类啦,故也诞生了此篇文章. 下面代码中,溪源也将import导入的依赖也贴出来了,避免大家引入错误. import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.text.SimpleD

  • java按指定编码写入和读取文件内容的类分享

    可以指定编码如:utf-8来写入和读取文件.如果文件编码未知,可以通过该方法先得到文件的编码后再指定正确的编码来读取,否则会出现文件乱码问题. 如何识别文件编码请参考:java自动根据文件内容的编码来读取避免乱码 复制代码 代码如下: package com.zuidaima.util; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputS

  • php获取文件内容最后一行示例

    复制代码 代码如下: $rs = 'README.md';$fp = fopen($rs, 'r'); fseek($fp,-1,SEEK_END); $s = '';while(($c = fgetc($fp)) !== false) {  if($c == "\n" && $s) break;  $s = $c . $s;  fseek($fp, -2, SEEK_CUR);}fclose($fp);echo $s;exit;

  • Java获取文件路径常用方法解析

    1. 前言 Java 开发中我们经常要获取文件的路径,比如读取配置文件等等.今天我们就关于文件的路径和如何读取文件简单地探讨一下. 2. 文件的路径 文件的路径通常有 相对路径 与 绝对路径. 2.1 相对路径 以当前文件为基准进行一级级目录指向被引用的资源文件.在 Java 代码中以当前运行的代码所在的位置为参照位置,只要被引用的文件相对于引用的文件的位置不变就可以被读取到.一旦改变相对位置就无法被读取到. 2.2 绝对路径 文件在文件系统中真正存在的路径,是指从硬盘的根目录(Windows为

  • mysql 8.0.22 zip压缩包版(免安装)下载、安装配置步骤详解

    大家好,今天我在学习 MySQL 8.0.22安装及配置遇到了一些问题,特地将我整个安装过程分享出来希望可以帮助不会安装的小伙伴

  • jquery通过load获取文件的内容并跳到锚点的方法

    本文实例讲述了jquery通过load获取文件的内容并跳到锚点的方法.分享给大家供大家参考.具体分析如下: 昨天在做一个类似于帮助文档型的页面,左边是导航,右边显示的是内容.本来打算右边内容显示区域用iframe来实现,但由于要做iframe的适应高度所以就换了一种方法,使用jquery的ajax中的load方法. 获取远程文件中的内容很容易实现,直接使用jquery的load方法: $("#content").load("xxx.aspx") 这样很容易将xxx.

  • php读取文件内容的几种方法详解

    示例代码1: 用file_get_contents 以get方式获取内容 复制代码 代码如下: <?php$url='http://www.baidu.com/';$html=file_get_contents($url);//print_r($http_response_header);ec($html);printhr();printarr($http_response_header);printhr();?> 示例代码2: 用fopen打开url, 以get方式获取内容 复制代码 代码如

  • Java多文件以ZIP压缩包导出的实现方法

    本文实例为大家分享了Java多文件以ZIP压缩包导出的具体代码,供大家参考,具体内容如下 1.使用java实现吧服务器的图片打包成一个zip格式的压缩包导出,多个文件打包导出. 2.代码如下: **ImageByteUtil.java** public class ImageByteUtil{ private static float QUALITY = 0.6f; public static void compressZip(List<File> listfiles, OutputStrea

随机推荐