1. ZIP圧縮の実装
Java標準ライブラリのjava.util.zipパッケージを使用して、複数ファイルをZIP形式で圧縮する処理を実装できます。以下のサンプルコードでは、カスタムバッファサイズと拡張for文を使用した実装例を示します:
import java.io.*;
import java.util.zip.*;
public class ZipArchiver {
public static void main(String[] args) {
String[] sourceFiles = {"document.txt", "data.csv", "image.png"};
String outputZip = "archive.zip";
try (FileOutputStream fos = new FileOutputStream(outputZip);
ZipOutputStream zos = new ZipOutputStream(fos)) {
byte[] buffer = new byte[2048];
for (String filePath : sourceFiles) {
File fileToZip = new File(filePath);
try (FileInputStream fis = new FileInputStream(fileToZip)) {
zos.putNextEntry(new ZipEntry(fileToZip.getName()));
int bytesRead;
while ((bytesRead = fis.read(buffer)) > 0) {
zos.write(buffer, 0, bytesRead);
}
zos.closeEntry();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. ZIP解凍の実装
ZIPファイルからの解凍処理はZipInputStreamを使用して実現可能です。以下のコードでは、階層構造を保持したファイル展開を実装しています:
import java.io.*;
import java.util.zip.*;
public class ZipExtractor {
public static void main(String[] args) {
String inputZip = "archive.zip";
String targetDir = "extracted/";
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(inputZip))) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
File outputFile = new File(targetDir + entry.getName());
if (entry.isDirectory()) {
outputFile.mkdirs();
continue;
}
outputFile.getParentFile().mkdirs();
try (FileOutputStream fos = new FileOutputStream(outputFile)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = zis.read(buffer)) > 0) {
fos.write(buffer, 0, bytesRead);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 第三者ライブラリの活用
複雑な圧縮形式にはApache Commons Compressライブラリが有効です。以下はtar.gz形式での圧縮例:
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
// Maven依存:org.apache.commons:commons-compress
public class TarGzArchiver {
public static void main(String[] args) throws Exception {
try (FileOutputStream fos = new FileOutputStream("data.tar.gz");
GzipCompressorOutputStream gzipOut = new GzipCompressorOutputStream(fos);
TarArchiveOutputStream tarOut = new TarArchiveOutputStream(gzipOut)) {
File[] sourceFiles = {new File("file1.txt"), new File("file2.txt")};
for (File file : sourceFiles) {
TarArchiveEntry entry = new TarArchiveEntry(file, file.getName());
tarOut.putArchiveEntry(entry);
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[8192];
int count;
while ((count = fis.read(buffer)) > 0) {
tarOut.write(buffer, 0, count);
}
}
tarOut.closeArchiveEntry();
}
}
}
}