Java는 파일 압축과 해제를 간단하게 처리할 수 있는 강력한 도구를 제공합니다. 특히, java.util.zip
패키지는 Zip 형식의 파일을 생성하고 읽는 데 필요한 다양한 클래스와 메서드를 포함하고 있습니다. 이 블로그에서는 Java에서의 파일 압축과 해제에서 Zip 파일 다루는 방법 알아보겠습니다.
1. Zip 파일의 기본 이해
Zip 파일이란?
- 여러 파일을 하나의 압축 파일로 묶는 형식입니다.
- 데이터 압축을 통해 저장 공간을 절약하고, 파일 전송 속도를 향상시킬 수 있습니다.
Java의 java.util.zip
패키지는 다음과 같은 주요 클래스를 제공합니다:
- ZipOutputStream: 파일을 압축하여 Zip 파일을 생성합니다.
- ZipInputStream: Zip 파일의 내용을 읽습니다.
- ZipEntry: Zip 파일의 개별 항목을 나타냅니다.
2. Java로 Zip 파일 생성하기
Zip 파일을 생성하려면 ZipOutputStream
과 FileOutputStream
을 결합하여 사용합니다.
Zip 파일 생성 예제
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileCreation {
public static void main(String[] args) {
String[] files = {"file1.txt", "file2.txt"};
String zipFileName = "output.zip";
try (FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String file : files) {
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file);
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
fis.close();
}
System.out.println("Zip 파일 생성 완료: " + zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
설명:
ZipOutputStream
을 사용하여 압축 데이터를 작성합니다.- 각 파일을
ZipEntry
객체로 추가합니다. - 파일 데이터를 읽어
ZipOutputStream
에 작성합니다.
3. Java로 Zip 파일 해제하기
Zip 파일의 압축을 해제하려면 ZipInputStream
과 FileOutputStream
을 사용합니다.
Zip 파일 해제 예제
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileExtraction {
public static void main(String[] args) {
String zipFileName = "output.zip";
String outputDir = "unzipped/";
try (FileInputStream fis = new FileInputStream(zipFileName);
ZipInputStream zis = new ZipInputStream(fis)) {
ZipEntry zipEntry;
while ((zipEntry = zis.getNextEntry()) != null) {
File newFile = new File(outputDir + zipEntry.getName());
System.out.println("추출 중: " + newFile.getAbsolutePath());
// 디렉토리 생성
new File(newFile.getParent()).mkdirs();
try (FileOutputStream fos = new FileOutputStream(newFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
}
System.out.println("Zip 파일 해제 완료.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
설명:
ZipInputStream
을 사용하여 압축 파일을 읽습니다.ZipEntry
객체를 순회하며 파일을 추출합니다.- 필요한 경우 디렉토리를 생성한 후 파일 데이터를 씁니다.
4. 추가 기능: 비밀번호 보호 및 압축 레벨 설정
Java 기본 java.util.zip
패키지는 비밀번호 보호를 지원하지 않지만, Apache Commons Compress와 같은 외부 라이브러리를 사용하여 이를 구현할 수 있습니다.
압축 레벨 설정:
ZipOutputStream
에서 압축 레벨을 설정하려면setLevel()
메서드를 사용합니다.
예:
zos.setLevel(Deflater.BEST_COMPRESSION);
5. 파일 압축과 해제의 실용적 활용 사례
- 대규모 데이터 백업
- 데이터 파일을 압축하여 저장 공간을 절약하고 전송 속도를 향상 시킵니다.
- 로그 파일 아카이빙
- 애플리케이션 로그를 주기적으로 Zip 파일로 압축하여 관리 합니다.
- 파일 배포
- 여러 파일을 하나의 압축 파일로 묶어 사용자에게 전달 합니다.
결론
Java에서의 파일 압축과 해제에서 Zip 파일 다루는 방법 알아보았습니다. Java의 java.util.zip
패키지는 간단한 API로 강력한 파일 압축과 해제 기능을 제공합니다.
ZipOutputStream
과 ZipInputStream
을 적절히 활용하면 대규모 데이터 처리와 파일 관리 작업을 효율적으로 수행할 수 있습니다.
더 나아가 Apache Commons Compress와 같은 외부 라이브러리를 사용하면 추가적인 보안과 기능을 구현할 수 있습니다. 다음 블로그에서는 Java에서의 비동기 처리:리에서 CompletableFuture 활용법을 알아 보겠습니다. 감사합니다.