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 형식의 표준 압축 파일이 필요하다면 ZipOutputStream과 ZipEntry를 함께 사용하는 방법도 고려해 볼 수 있습니다.