Home  >  Article  >  Java  >  How to parse zip archives and obtain file contents in Java

How to parse zip archives and obtain file contents in Java

WBOY
WBOYforward
2023-05-18 11:34:065804browse

Function Description

Upload a source code compressed package on the page, and the backend will decompress the compressed package and obtain the contents of each file.

Related source code

(1) First define an entity class corresponding to the decompressed file.

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) Next is the decompression tool class.

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;
    }
}

Calling instructions

The tool class provides two decompression methods:

Method 1: Decompress the local file File.

Method 2: Upload the file to MultipartFile for decompression.

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);
    }
 
}

Testing effect

We take the uploaded compressed package parsing as an example and conduct interface testing through Postman. The parsing results are as follows.

How to parse zip archives and obtain file contents in Java

The above is the detailed content of How to parse zip archives and obtain file contents in Java. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete