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 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 entries = zip.entries();List 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 unzip(MultipartFile multipartFile) {File file = getFile(multipartFile);if (Objects.isNull(file)) {return Collections.emptyList();}List 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 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 进行接口测试,解析的结果如下。

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部