JAVA : zip 압축하기 (압축파일 암호설정)

암호가 걸린 zip 파일을 맹글기 위해 zip4j 를 사용했다.

maven dependency

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.3</version>
</dependency>

Zipper.java

package io.github.stove99.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

public class Zipper {

    private List<File> files = new ArrayList<>();

    /**
     * 압축할 파일 추가
     */
    public Zipper add(String file) {
        return add(new File(file));
    }

    public Zipper add(File file) {
        if (file == null || !file.exists())
            throw new RuntimeException("파일이 존재하지 않습니다.");

        files.add(file);

        return this;
    }

    /**
     * 압축하기
     *
     * @param to 생성할 압축파일
     * @throws ZipException
     */
    public void zip(String to) throws ZipException {
        this.zip(to, null);
    }

    /**
     * 비밀번호 걸어서 압축하기
     *
     * @param to       생성할 압축파일
     * @param password 압축파일 암호
     * @throws ZipException
     */
    public void zip(String to, String password) throws ZipException {
        ZipParameters param = new ZipParameters();
        param.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        param.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_ULTRA);

        if (password != null) {
            param.setEncryptFiles(true);
            param.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
            param.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
            param.setPassword(password);
        }

        ZipFile zipFile = new ZipFile(to);

        if (files.size() == 0) {
            throw new RuntimeException("압축대상 파일이 없습니다.");
        }

        files.forEach(file -> {
            try {
                if (file.isFile()) {
                    zipFile.addFile(file, param);
                } else {
                    zipFile.addFolder(file, param);
                }
            } catch (ZipException e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 압축풀기
     *
     * @param file
     * @param password
     * @throws ZipException
     */
    public void unzip(String file, String password) throws ZipException {
        File f = new File(file);

        ZipFile zipFile = new ZipFile(f);

        if (zipFile.isEncrypted()) {
            zipFile.setPassword(password);
        }

        zipFile.extractAll(f.getParent());
    }

    public void unzip(String file) throws ZipException {
        this.unzip(file, null);
    }
}

Zipper 사용법

Zipper zipper = new Zipper();

// 암호를 1234qwer 로 해서 압축함
zipper.add("d:\\tmp").add("d:\\other\\스크립.txt").zip("d:\\압축.zip", "1234qwer");
Zipper zipper = new Zipper();

// 암호없이 압축함
zipper.add("d:\\tmp").add("d:\\other\\스크립.txt").zip("d:\\압축.zip");

압축결과