JAVA/JAVA

파일 압축

lovineff 2023. 5. 25. 10:19

기본 압축 방법 (압축파일내 폴더 미생성)

public void pack(List<String> zipFileList, String zipFilePath, String zipFileName) throws IOException {
        log.info("------ zip pack start ------");
        log.info("zipFileList.size() = {}", zipFileList.size());
        log.info("zipFilePath = {}", zipFilePath);
        log.info("zipFileName = {}", zipFileName);

        // 압축 파일 디렉토리 생성
        Path zipDir = Paths.get(zipFilePath);
        Files.createDirectories(zipDir);

        // 압축파일 생성
        Path p = Files.createFile(Paths.get(zipFilePath + "/" + zipFileName));
        // 압축파일내 파일 추가 작업
        try (ZipOutputStream zs = new ZipOutputStream(Files.newOutputStream(p));){
             zipFileList.forEach(filePath ->{
                 Path path = Paths.get(filePath);
                 if(!Files.isDirectory(path)){
                     log.info("to Zip file = {}", filePath);

                     // 압축파일내 파일 생성
                     // ZipEntity 내에 경로 입력시 압축해제시 경로가 그대로 생성된다.
                     ZipEntry zipEntry = new ZipEntry(path.getFileName().toString());
                     try {
                         zs.putNextEntry(zipEntry);
                         Files.copy(path, zs);
                         zs.closeEntry();
                     } catch (IOException e) {
                         System.err.println(e);
                     }
                 }
             });
        }

        log.info("------ zip file end ------");
    }

 

압축파일내 폴더 추가 방법

파일별 폴더 경로를 생성하기 위한 객체

@Getter
@Builder
public class ZipVO {
    private String originFileFullPath;
    private String zipInnerFolderPath;
}

압축 작업

public void packByZipVOList(List<ZipVO> zipVOList, String zipFilePath, String zipFileName) throws IOException {
        log.info("------ zip pack start ------");
        log.info("zipVOList.size() = {}", zipVOList.size());
        log.info("zipFilePath = {}", zipFilePath);
        log.info("zipFileName = {}", zipFileName);

        Path zipDir = Paths.get(zipFilePath);
        Files.createDirectories(zipDir);

        Path p = Files.createFile(Paths.get(zipFilePath + "/" + zipFileName));
        try (ZipOutputStream zs = new ZipOutputStream(Files.newOutputStream(p))){
            zipVOList.forEach(zipVO ->{
                Path path = Paths.get(zipVO.getOriginFileFullPath());
                if(!Files.isDirectory(path)){
                    log.info("to Zip file = {}", zipVO.getOriginFileFullPath());
                    ZipEntry zipEntry = new ZipEntry((StringUtils.hasText(zipVO.getZipInnerFolderPath()) ? "/" + zipVO.getZipInnerFolderPath() : "") + "/" + path.getFileName());
                    try {
                        zs.putNextEntry(zipEntry);
                        Files.copy(path, zs);
                        zs.closeEntry();
                    } catch (IOException e) {
                        System.err.println(e);
                    }
                }
            });
        }

        log.info("------ zip file end ------");
    }

테스트 코드로 실제 압축파일 생성 테스트

@Test
    void packByZipVO() throws IOException {
        String zipFilePath = "/Users/a/Downloads";
        String zipFileName = "test.zip";

        List<ZipVO> zipFileList = new ArrayList<>();
        zipFileList.add(ZipVO.builder()
                .originFileFullPath("/Users/a/Downloads/202305/202304/a.xlsx")
                .zipInnerFolderPath("202304/1")
                .build());

        zipFileList.add(ZipVO.builder()
                .originFileFullPath("/Users/a/Downloads/202305/202304/b.xlsx")
                .zipInnerFolderPath(null)
                .build());

        zipFileList.add(ZipVO.builder()
                .originFileFullPath("/Users/a/Downloads/202305/202304/c.xlsx")
                .zipInnerFolderPath("202304")
                .build());

        zipFileList.add(ZipVO.builder()
                .originFileFullPath("/Users/a/Downloads/202305/20230521/d.xlsx")
                .zipInnerFolderPath("20230521/1")
                .build());

        zipFileList.add(ZipVO.builder()
                .originFileFullPath("/Users/a/Downloads/202305/20230521/e.xlsx")
                .zipInnerFolderPath(null)
                .build());

        packByZipVOList(zipFileList, zipFilePath, zipFileName);
    }

생성 결과 (압축 해제)

'JAVA > JAVA' 카테고리의 다른 글

파일 거꾸로 읽기  (0) 2023.05.26
Default Method(인터페이스 디폴트 메소드)  (0) 2021.07.07
Equals 구현  (0) 2021.03.22
1000단위 콤마 입력  (0) 2021.03.09
이메일 마스킹 처리  (0) 2021.03.09