Java ZIP 解凍する方法 ディレクトリ指定 - ZipEntry・ZipFile

JavaでZipEntryとZipFileを使ってZIPファイルを解凍する方法です。

実務ではZIP 解凍したい方法として「特定のディレクトリに解凍したい」などの要望があるかと思います。これを実現するサンプルを用意しました。

ここでは JavaでZipEntryとZipFileを使ってZIPファイルを解凍する方法 を紹介します。


サンプルソース

それでは、実際のソースを見ながら解説してきます。今回は、ZipUnCompressUtils というクラスを用意しました。


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * <p><strong>ZipUnCompressUtils</strong>は、 ZIP 解凍をおこなう上で利便性の高い機能を提供します。</p>
 *
 * @author Sakakibara Engineering Office.
 * @version $Revision: 1.0 $ $Date: 2013.11.07 $ $Description: 新規作成 $
 */
public class ZipUnCompressUtils {

  /**
   * 指定された ZIP ファイルを、指定されたパスに、ファイル名のディレクトリを作成して解凍します。 <br>
   *
   * @param zipFileFullPath ZIP ファイルのフルパス
   * @param unzipPath 解凍するパス
   * @return 処理結果 true:解凍成功 false:解凍失敗
   */
  public static boolean unzip( String zipFileFullPath, String unzipPath ) {

    File baseFile = new File(zipFileFullPath);
    File baseDir = new File(baseFile.getParent(), baseFile.getName().substring(0, baseFile.getName().lastIndexOf(".")));
    if ( !baseDir.mkdir() )
      System.out.println("Couldn't create directory because directory with the same name exists.: " + baseDir);

    ZipFile zipFile = null;
    try {
      // ZIPファイルオブジェクト作成
      zipFile = new ZipFile(zipFileFullPath);

      // ZIPファイル内のファイルを列挙
      Enumeration<? extends ZipEntry>  enumZip = zipFile.entries();

      // ZIPファイル内の全てのファイルを展開
      while ( enumZip.hasMoreElements() ) {

        // ZIP内のエントリを取得
        ZipEntry zipEntry = (java.util.zip.ZipEntry)enumZip.nextElement();

        //出力ファイル取得
        File unzipFile = new File(unzipPath);
        File outFile = new File(unzipFile.getAbsolutePath() + "/" + baseDir.getName(), zipEntry.getName());

        if ( zipEntry.isDirectory() )
          outFile.mkdir();
        else {
          // 圧縮ファイル入力ストリーム作成
          BufferedInputStream in = new BufferedInputStream(zipFile.getInputStream(zipEntry));

          // 親ディレクトリがない場合、ディレクトリ作成
          if ( !outFile.getParentFile().exists() )
            outFile.getParentFile().mkdirs();

          // 出力オブジェクト取得
          BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outFile));

          // 読み込みバッファ作成
          byte[] buffer = new byte[1024];

          // 解凍ファイル出力
          int readSize = 0;
          while ( (readSize = in.read(buffer)) != -1 ) {
            out.write(buffer, 0, readSize);
          }
          // クローズ
          try { out.close(); } catch (Exception e) {}
          try { in.close(); } catch (Exception e) {}
        }
      }
      // 解凍処理成功
      return true;
    } catch(Exception e) {
      // エラーログ出力
      System.out.println(e.toString());
      // 解凍処理失敗
      return false;
    } finally {
      if ( zipFile != null )
        try { zipFile.close();  } catch (Exception e) {}
    }
  }
}

解凍(UNZIP)する

指定した ZIP ファイルを、指定したディレクトリに解凍します。

引数説明
zipFileFullPathStringZIP ファイルのパスを指定します。
( 例: C:/samples/unzip/サンプル.zip )
unzipPathString圧縮したいディレクトリを指定します。
( 例; C:/samples/unzip )

それでは、テストしてみましょう。

まずは、[ C:/samples/サンプル(フォルダ無).zip ] という ZIP ファイルを、[ C:/samples/unzip ] のディレクトリへ解凍してみます。この ZIP 内には、フォルダがありません。テキストファイルが 2 つあるだけです。

unZip Compress 001

unZip Compress 002

以下のテストソースを実行します。


ZipUnCompressUtils.unzip("C:/samples/unzip/サンプル(フォルダ無).zip", "C:/samples/unzip");

結果は、以下の通りです。

unZip Compress 003

unZip Compress 004

おおおー、いい感じー^^

次は、[ C:/samples/サンプル(フォルダ有).zip ] という ZIP ファイルを、[ C:/samples/unzip ] のディレクトリへ解凍してみます。この ZIP 内には、txt というフォルダがあります。フォルダ内はテキストファイルがあります。

unZip Compress 005

unZip Compress 006

以下のテストソースを実行します。


ZipUnCompressUtils.unzip("C:/samples/unzip/サンプル(フォルダ有).zip", "C:/samples/unzip");

結果は、以下の通りです。

unZip Compress 007

unZip Compress 008

ふむふむ、いい感じですねー^^

ZIP 圧縮する方法

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。