[java] 자바에서 처리할 수 있는 대용량 데이터를 압축하는 방법

자바는 대용량 데이터를 처리하는 데 매우 효과적인 언어입니다. 그러나 때로는 이러한 데이터를 압축해야 할 필요가 있을 수 있습니다. 이 글에서는 자바에서 대용량 데이터를 압축하는 세 가지 방법에 대해 살펴보겠습니다.

1. GZip 압축 사용하기

GZip은 자바에서 가장 일반적으로 사용되는 압축 형식 중 하나입니다. GZipOutputStream 클래스를 사용하여 데이터를 압축하고 GZipInputStream 클래스를 사용하여 압축을 해제할 수 있습니다.

import java.io.*;
import java.util.zip.GZIPOutputStream;

public class GZipExample {
    public static void compressData(String sourceFilePath, String compressedFilePath) throws IOException {
        FileInputStream fis = new FileInputStream(sourceFilePath);
        FileOutputStream fos = new FileOutputStream(compressedFilePath);
        GZIPOutputStream gzipOS = new GZIPOutputStream(fos);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) > 0) {
            gzipOS.write(buffer, 0, bytesRead);
        }

        fis.close();
        gzipOS.finish();
        gzipOS.close();
    }

    public static void main(String[] args) throws IOException {
        String sourceFilePath = "/path/to/source/file";
        String compressedFilePath = "/path/to/compressed/file.gz";
        compressData(sourceFilePath, compressedFilePath);
    }
}

위의 코드는 주어진 소스 파일 (sourceFilePath)을 GZip 형식으로 압축한 후 압축된 파일 (compressedFilePath)을 생성합니다.

2. Zip 압축 사용하기

압축된 디렉터리 구조를 유지하면서 여러 파일과 디렉터리를 하나의 Zip 파일로 압축하려면 java.util.zip 패키지의 ZipOutputStream 클래스를 사용할 수 있습니다.

import java.io.*;
import java.util.zip.*;

public class ZipExample {
    public static void compressData(String sourceDirectoryPath, String compressedFilePath) throws IOException {
        FileOutputStream fos = new FileOutputStream(compressedFilePath);
        ZipOutputStream zipOS = new ZipOutputStream(fos);

        File sourceDirectory = new File(sourceDirectoryPath);
        compressDirectory(sourceDirectory, sourceDirectory.getName(), zipOS);

        zipOS.close();
        fos.close();
    }

    public static void compressDirectory(File directory, String baseName, ZipOutputStream zipOS) throws IOException {
        File[] files = directory.listFiles();
        byte[] buffer = new byte[1024];
        int bytesRead;

        for (File file : files) {
            if (file.isDirectory()) {
                compressDirectory(file, baseName + File.separator + file.getName(), zipOS);
                continue;
            }

            FileInputStream fis = new FileInputStream(file);
            ZipEntry zipEntry = new ZipEntry(baseName + File.separator + file.getName());
            zipOS.putNextEntry(zipEntry);

            while ((bytesRead = fis.read(buffer)) > 0) {
                zipOS.write(buffer, 0, bytesRead);
            }

            fis.close();
        }
    }

    public static void main(String[] args) throws IOException {
        String sourceDirectoryPath = "/path/to/source/directory";
        String compressedFilePath = "/path/to/compressed/file.zip";
        compressData(sourceDirectoryPath, compressedFilePath);
    }
}

위의 코드는 주어진 소스 디렉터리 (sourceDirectoryPath)를 압축한 후 Zip 파일 (compressedFilePath)을 생성합니다. compressDirectory 메서드를 사용하여 하위 디렉터리 및 모든 파일을 압축하고 압축 파일과 각 파일의 경로를 유지합니다.

3. BZip2 압축 사용하기

BZip2는 GZip보다 더 효율적인 압축 알고리즘입니다. Apache Commons Compress 라이브러리를 사용하여 자바에서 BZip2 압축 기능을 사용할 수 있습니다.

import java.io.*;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;

public class BZip2Example {
    public static void compressData(String sourceFilePath, String compressedFilePath) throws IOException {
        FileInputStream fis = new FileInputStream(sourceFilePath);
        FileOutputStream fos = new FileOutputStream(compressedFilePath);
        BZip2CompressorOutputStream bzip2OS = new BZip2CompressorOutputStream(fos);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) > 0) {
            bzip2OS.write(buffer, 0, bytesRead);
        }

        fis.close();
        bzip2OS.finish();
        bzip2OS.close();
    }

    public static void main(String[] args) throws IOException {
        String sourceFilePath = "/path/to/source/file";
        String compressedFilePath = "/path/to/compressed/file.bz2";
        compressData(sourceFilePath, compressedFilePath);
    }
}

위의 코드는 주어진 소스 파일 (sourceFilePath)을 BZip2 형식으로 압축한 후 압축된 파일 (compressedFilePath)을 생성합니다. Apache Commons Compress 라이브러리의 BZip2CompressorOutputStream 클래스를 사용합니다.

결론

위에서 소개한 세 가지 방법을 사용하여 자바에서 대용량 데이터를 압축할 수 있습니다. GZip, Zip, BZip2 등의 압축 형식을 사용하여 데이터를 효과적으로 압축하고 필요에 따라 압축을 해제할 수 있습니다.