>  기사  >  Java  >  Java에서 zip 아카이브를 구문 분석하고 파일 내용을 얻는 방법

Java에서 zip 아카이브를 구문 분석하고 파일 내용을 얻는 방법

WBOY
WBOY앞으로
2023-05-18 11:34:065744검색

기능 설명

페이지에 소스 코드 압축 패키지를 업로드하면 백엔드가 압축 패키지의 압축을 풀고 각 파일의 내용을 가져옵니다.

관련 소스코드

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

통화 지침

도구 클래스는 두 가지 압축 해제 방법을 제공합니다.

방법 1: 로컬 파일 파일의 압축을 풉니다.

방법 2: 파일을 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 아카이브를 구문 분석하고 파일 내용을 얻는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제