Java에서 ZIP 파일을 생성을 지원하는 라이브러리로 ZipOutputStream과 ZipArchiveOutputStream이 있다.
ZipOutputStream은 Java 표준 라이브러리로 기본적인 ZIP 압축 기능을 제공하고, ZipArchiveOutputStream은 Apache Commons Compress 라이브러리이며 다양한 압축 수준과 ZIP64 포맷을 지원한다.
ZipOutputStream
Java 표준 라이브러리로 ZIP 파일을 생성하고 데이터를 압축하는 스트림이며 파일 또는 디렉토리를 ZipEntry에 추가하고, 데이터를 압축하여 ZIP 파일로 저장한다. 기본적인 ZIP 압축 기능만 제공하고 압축 수준을 조절할 수 없어 간단하고 기본적인 ZIP 파일 생성에 적합하다.
ZIP64 포맷을 지원하지 않기 때문에 최대 4GB로 제한하고, 파일 개수를 65,535개로 제한한다.
import java.io.*;
import java.util.zip.*;
public class ZipOutputStreamExample {
public static void main(String[] args) throws IOException {
try (FileOutputStream fos = new FileOutputStream("output.zip");
ZipOutputStream zos = new ZipOutputStream(fos)) {
// 첫 번째 파일 추가
ZipEntry zipEntry1 = new ZipEntry("file1.txt");
zos.putNextEntry(zipEntry1);
zos.write("Hello, World!".getBytes());
zos.closeEntry();
// 두 번째 파일 추가
ZipEntry zipEntry2 = new ZipEntry("file2.txt");
zos.putNextEntry(zipEntry2);
zos.write("Another file content".getBytes());
zos.closeEntry();
}
}
}
ZipArchiveOutputStream
Apache Commons Compress 라이브러리이며 ZIP 파일을 생성하고 데이터를 압축하는 고급 스트림이다. DEFLATE, BZIP2, LZMA 등 다양한 수준과 알고리즘을 제공하며 ZIP64 포맷을 지원하여 대용량 ZIP 파일을 생성할 수 있다.
//gradle
implementation 'org.apache.commons:commons-compress:1.27.1'
import org.apache.commons.compress.archivers.zip.*;
import java.io.*;
public class ZipArchiveOutputStreamExample {
public static void main(String[] args) throws IOException {
try (FileOutputStream fos = new FileOutputStream("output.zip");
ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(fos)) {
// 압축 수준 설정 (예: Deflate)
zaos.setLevel(Deflater.BEST_COMPRESSION);
// 첫 번째 파일 추가
ZipArchiveEntry entry1 = new ZipArchiveEntry("file1.txt");
zaos.putArchiveEntry(entry1);
zaos.write("Hello, World!".getBytes());
zaos.closeArchiveEntry();
}
}
}
ZipOutputStream vs ZipArchiveOutputStream
ZipOutputStream | ZipArchiveOutputStream | |
라이브러리 | java.util.zip (Java 표준 라이브러리) | org.apache.commons.compress.archivers.zip (Apache Commons) |
압축 수준 | 설정 불가 (기본 수준으로 압축) | 설정 가능 (압축 수준과 알고리즘 선택 가능) |
ZIP64 포맷 지원 | 제한적 (기본적으로는 미지원) | 지원 (대용량 파일 압축 가능) |
압축 알고리즘 | DEFLATE만 지원 | 여러 알고리즘 지원 (예: DEFLATE, BZIP2, LZMA 등) |
파일 메타데이터 제어 | 기본적인 메타데이터만 제공 (이름, 압축 크기 등) | 파일 권한 및 추가 메타데이터(유닉스 권한, 시스템 정보) 제공 |
사용 난이도 | 비교적 간단 | 더 많은 기능과 설정이 있어 복잡하지만 더 강력함 |
성능 | 적당한 성능 | 더 세밀하게 압축을 설정할 수 있어 성능 조절 가능 |
사용 예 | 기본적인 ZIP 파일 생성 및 압축 작업 | 대용량 파일 또는 고급 ZIP 기능이 필요한 경우 |
'Java' 카테고리의 다른 글
FileInputStream vs BufferedInputStream (0) | 2024.11.03 |
---|---|
JDK Dynamic Proxy와 CGLIB (0) | 2024.07.30 |
Java Collections Framework (0) | 2020.03.25 |
(Java) JVM 메모리 구조 (0) | 2020.03.18 |
(Java) 객체지향 프로그래밍 (0) | 2020.03.18 |