Java에서의 파일 압축과 해제에서 Zip 파일 다루는 방법 알아보기

Java는 파일 압축과 해제를 간단하게 처리할 수 있는 강력한 도구를 제공합니다. 특히, java.util.zip 패키지는 Zip 형식의 파일을 생성하고 읽는 데 필요한 다양한 클래스와 메서드를 포함하고 있습니다. 이 블로그에서는 Java에서의 파일 압축과 해제에서 Zip 파일 다루는 방법 알아보겠습니다.


1. Zip 파일의 기본 이해

Zip 파일이란?

  • 여러 파일을 하나의 압축 파일로 묶는 형식입니다.
  • 데이터 압축을 통해 저장 공간을 절약하고, 파일 전송 속도를 향상시킬 수 있습니다.

Java의 java.util.zip 패키지는 다음과 같은 주요 클래스를 제공합니다:

  1. ZipOutputStream: 파일을 압축하여 Zip 파일을 생성합니다.
  2. ZipInputStream: Zip 파일의 내용을 읽습니다.
  3. ZipEntry: Zip 파일의 개별 항목을 나타냅니다.

2. Java로 Zip 파일 생성하기

Zip 파일을 생성하려면 ZipOutputStreamFileOutputStream을 결합하여 사용합니다.

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

설명:

  1. ZipOutputStream을 사용하여 압축 데이터를 작성합니다.
  2. 각 파일을 ZipEntry 객체로 추가합니다.
  3. 파일 데이터를 읽어 ZipOutputStream에 작성합니다.

3. Java로 Zip 파일 해제하기

Zip 파일의 압축을 해제하려면 ZipInputStreamFileOutputStream을 사용합니다.

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

설명:

  1. ZipInputStream을 사용하여 압축 파일을 읽습니다.
  2. ZipEntry 객체를 순회하며 파일을 추출합니다.
  3. 필요한 경우 디렉토리를 생성한 후 파일 데이터를 씁니다.

4. 추가 기능: 비밀번호 보호 및 압축 레벨 설정

Java 기본 java.util.zip 패키지는 비밀번호 보호를 지원하지 않지만, Apache Commons Compress와 같은 외부 라이브러리를 사용하여 이를 구현할 수 있습니다.

압축 레벨 설정:

  • ZipOutputStream에서 압축 레벨을 설정하려면 setLevel() 메서드를 사용합니다.

예:

zos.setLevel(Deflater.BEST_COMPRESSION);

5. 파일 압축과 해제의 실용적 활용 사례

  1. 대규모 데이터 백업
    • 데이터 파일을 압축하여 저장 공간을 절약하고 전송 속도를 향상 시킵니다.
  2. 로그 파일 아카이빙
    • 애플리케이션 로그를 주기적으로 Zip 파일로 압축하여 관리 합니다.
  3. 파일 배포
    • 여러 파일을 하나의 압축 파일로 묶어 사용자에게 전달 합니다.

결론

Java에서의 파일 압축과 해제에서 Zip 파일 다루는 방법 알아보았습니다. Java의 java.util.zip 패키지는 간단한 API로 강력한 파일 압축과 해제 기능을 제공합니다.

ZipOutputStreamZipInputStream을 적절히 활용하면 대규모 데이터 처리와 파일 관리 작업을 효율적으로 수행할 수 있습니다.

더 나아가 Apache Commons Compress와 같은 외부 라이브러리를 사용하면 추가적인 보안과 기능을 구현할 수 있습니다. 다음 블로그에서는 Java에서의 비동기 처리:리에서 CompletableFuture 활용법을 알아 보겠습니다. 감사합니다.

Leave a Comment