자바는 대용량 데이터를 처리하는 데 매우 효과적인 언어입니다. 그러나 때로는 이러한 데이터를 압축해야 할 필요가 있을 수 있습니다. 이 글에서는 자바에서 대용량 데이터를 압축하는 세 가지 방법에 대해 살펴보겠습니다.
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 등의 압축 형식을 사용하여 데이터를 효과적으로 압축하고 필요에 따라 압축을 해제할 수 있습니다.