はじめに
Javaでは標準ライブラリを使って、ファイルやフォルダのZIP圧縮・解凍が可能です。外部ライブラリなしでも簡単に使えるため、ファイルバックアップやログ整理など実務でも役立ちます。
この記事では、以下の2つの操作を中心に、実用コード付きで詳しく解説します。
- ZIPファイルの作成(圧縮)
- ZIPファイルの展開(解凍)
前提環境
- Java 11以上(Java 8でも可)
- 特別なライブラリ不要(
java.util.zip
パッケージを使用)
ZIP圧縮のコード(単一ファイル)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipSingleFile {
public static void main(String[] args) throws Exception {
String sourceFile = "sample.txt";
String zipFile = "sample.zip";
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
FileInputStream fis = new FileInputStream(sourceFile)) {
ZipEntry zipEntry = new ZipEntry(sourceFile);
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
System.out.println("ZIP圧縮が完了しました。");
}
}
}
ZIP圧縮のコード(複数ファイル)
import java.io.*;
import java.util.zip.*;
public class ZipMultipleFiles {
public static void main(String[] args) throws IOException {
String[] files = {"a.txt", "b.txt", "c.txt"};
String zipFile = "multi.zip";
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String fileName : files) {
try (FileInputStream fis = new FileInputStream(fileName)) {
ZipEntry entry = new ZipEntry(fileName);
zos.putNextEntry(entry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
}
}
}
System.out.println("複数ファイルのZIP圧縮が完了しました。");
}
}
ZIPファイルの解凍(展開)
import java.io.*;
import java.util.zip.*;
public class UnzipExample {
public static void main(String[] args) throws IOException {
String zipFilePath = "sample.zip";
String destDir = "output/";
File dir = new File(destDir);
if (!dir.exists()) dir.mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
File newFile = new File(destDir + entry.getName());
System.out.println("展開: " + newFile.getAbsolutePath());
try (FileOutputStream fos = new FileOutputStream(newFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
zis.closeEntry();
}
}
System.out.println("解凍が完了しました。");
}
}
エラーハンドリングと注意点
ZipEntry
名の取り扱いにはパスの整合性に注意(上書きされないようにする)- UTF-8対応が必要な場合は、
ZipOutputStream
にCharsetを指定することで対応可能(Java 11以降)
まとめ
- Javaでは標準APIだけでZIPの読み書きが可能
- バックアップ、ログ管理、ファイル転送の自動化にも応用可能
- 今後はディレクトリ構造の再現や、GUIツールとの連携も検討できます