JavaでファイルをZIP圧縮・解凍する方法【実用コード付き】

はじめに

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ツールとの連携も検討できます
タイトルとURLをコピーしました