Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 파일을 압축하는 방법 – DeflaterOutputStream 활용 가이드

Java에서는 DeflaterOutputStream 클래스를 사용해 주어진 데이터를 압축하고, 그 결과를 출력 대상으로 스트리밍할 수 있습니다.

이 클래스의 write() 메서드는 데이터(정수 또는 바이트 형식)를 받아 압축한 뒤, 현재 DeflaterOutputStream 객체가 연결된 출력 대상에 기록합니다. 이 메서드를 활용해 파일을 압축하려면 다음 단계를 따르면 됩니다.

파일 압축 절차

  • 압축할 파일의 경로를 문자열(String) 형태로 생성자에 전달하여 FileInputStream 객체를 생성합니다.
  • 압축 결과를 저장할 출력 파일의 경로를 문자열 형태로 전달하여 FileOutputStream 객체를 생성합니다.
  • 앞서 만든 FileOutputStream 객체를 매개변수로 전달하여 DeflaterOutputStream 객체를 생성합니다.
  • 입력 파일의 내용을 읽어 들이면서 DeflaterOutputStream의 write() 메서드로 기록합니다.

예제 코드

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.DeflaterOutputStream;

public class CompressingFiles {
    public static void main(String args[]) throws IOException {
        // FileInputStream 객체 생성
        String inputPath = "D:\ExampleDirectory\logo.jpg";
        FileInputStream inputStream = new FileInputStream(inputPath);

        // FileOutputStream 객체 생성
        String outputPath = "D:\ExampleDirectory\compressedLogo.txt";
        FileOutputStream outputStream = new FileOutputStream(outputPath);

        // DeflaterOutputStream 객체 생성
        DeflaterOutputStream compressor = new DeflaterOutputStream(outputStream);

        int contents;
        while ((contents = inputStream.read()) != -1) {
            compressor.write(contents);
        }

        compressor.close();
        inputStream.close();
        System.out.println("File compressed.......");
    }
}

실행 결과

File compressed.......

참고 사항

위 예제는 파일 내용을 한 바이트씩 읽고 쓰기 때문에 큰 파일에서는 성능이 떨어질 수 있습니다. 실무에서는 버퍼를 사용하거나 try-with-resources 구문으로 스트림을 자동으로 닫는 것이 좋습니다.

try (FileInputStream in = new FileInputStream(inputPath);
     DeflaterOutputStream out =
         new DeflaterOutputStream(new FileOutputStream(outputPath))) {
    byte[] buffer = new byte[4096];
    int len;
    while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
    }
}

또한 DeflaterOutputStream은 DEFLATE 알고리즘 기반의 원시 압축 스트림이므로, 압축 해제 시에는 동일한 형식을 지원하는 InflaterInputStream을 사용해야 합니다. ZIP 형식의 표준 압축 파일이 필요하다면 ZipOutputStreamZipEntry를 함께 사용하는 방법도 고려해 볼 수 있습니다.