【Java】ZIP 処理 ~解凍編~

サンプル

ZipHelper.java

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipHelper {

   public static void unzip(String inputZipFile) {
      ZipHelper.unzip(inputZipFile, null);
   }

   public static void unzip(String inputZipFile, String outputFile) {
      try {
         File zipFile = new File(inputZipFile);
         // 出力先ディレクトリを作成
         File outputDirectry = ZipHelper.createOutputDirectry(zipFile,
               outputFile);
         ZipHelper.unzip(zipFile, outputDirectry);
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }

   /**
    * 出力先ディレクトリを作成
    * @param zipFile 解凍対象のZip File
    * @param outputFile 出力先ディレクトリ
    * @return 出力先ディレクトリ
    * @throws FileNotFoundException 
    */
   private static File createOutputDirectry(final File zipFile,
         final String outputFile) throws FileNotFoundException {
      File outputDirectry;
      if (outputFile != null) {
         outputDirectry = new File(outputFile);
      } else {
         // 出力先ディレクトリが指定されない場合、 対象のZipファイルと同名のディレクトリを作成
         String fileName = zipFile.getName();
         int indexOfExtention = fileName.lastIndexOf(".");
         String baseDirectryName = fileName.substring(0, indexOfExtention);
         outputDirectry = new File(zipFile.getParent(), baseDirectryName);
      }
      if (!outputDirectry.exists()) {
         // 出力先ディレクトリが存在しない場合、作成
         if (!outputDirectry.mkdir()) {
            throw new FileNotFoundException(outputDirectry + "の生成に失敗しました。");
         }
      }
      return outputDirectry;
   }

   private static void unzip(File zipFile, File baseDirectry) {
      try (ZipFile zip = new ZipFile(zipFile)) {
         Enumeration<? extends ZipEntry> entries = zip.entries();
         while (entries.hasMoreElements()) {
            ZipEntry zipEntry = entries.nextElement();

            File outFile = new File(baseDirectry, zipEntry.getName());
            if (zipEntry.isDirectory()) {
               // ZipEntry がディレクトリの場合はディレクトリを作成。
               outFile.mkdirs();
            } else {
               try (InputStream inputStream = zip.getInputStream(zipEntry);
                     BufferedInputStream bufferedInputStream = new BufferedInputStream(
                           inputStream);) {
                  if (!outFile.getParentFile().exists()) {
                     // 出力先ファイルの保存先ディレクトリが存在しない場合は、
                     // ディレクトリを作成しておく。
                     outFile.getParentFile().mkdirs();
                  }
                  try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
                        new FileOutputStream(outFile));) {
                     // 入力ストリームから読み込み、出力ストリームへ書き込む。
                     ZipHelper.writeStream(bufferedInputStream,
                           bufferedOutputStream);
                  }
               }
            }
         }
      } catch (ZipException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   private static void writeStream(InputStream inputStream,
         OutputStream outputStream) throws IOException {
      int availableByteNumber;
      while ((availableByteNumber = inputStream.available()) > 0) {
         byte[] buffers = new byte[availableByteNumber];
         int readByteNumber = inputStream.read(buffers);
         if (readByteNumber < 0) {
            break;
         }
         outputStream.write(buffers, 0, readByteNumber);
      }
   }
}

Main.java

* 使用者
* C:\\tempにフォルダ「Sample」と「test」にそれぞれ「C:\\temp\\Sample.zip」が解凍される
public class Main {
   public static void main(String[] args) {
      ZipHelper.unzip("C:\\temp\\Sample.zip");
      ZipHelper.unzip("C:\\temp\\Sample.zip", "C:\\temp\\test");
   }
}


関連記事

Java

ZIP 処理 ~圧縮編~

http://blogs.yahoo.co.jp/dk521123/33497835.html

ZIP 処理 ~解凍編~

http://blogs.yahoo.co.jp/dk521123/33645352.html

Servlet】 ZIP圧縮と同時にファイルをダウンロードさせる

http://blogs.yahoo.co.jp/dk521123/33647497.html

C#

ZIP圧縮・解凍に関するサンプルプログラム

http://blogs.yahoo.co.jp/dk521123/20127299.html

C#でZIPに圧縮・解凍について

http://blogs.yahoo.co.jp/dk521123/20103286.html