Java/サンプル/JavaでZipファイル解凍サンプル(commons-compress使用)

  • Javaには標準でZipの圧縮解凍が出来る機能がありますが、ファイル名をUTF-8として扱うため、Windowsで作成した日本語を含むファイルを正しく処理出来ません。
  • なので、JavaでZipファイルを扱う場合は、Apacheプロジェクトのcommons compressを使うのが一般的だと思います。
  • commons compressは下記からダウンロード出来ます
  • 「commons-compress1.4.1-bin.zip」をダウンロードして、中に入っている「commons-compress-1.4.1.jar」を解凍し、クラスパスに追加すると使えるようになります。

サンプルソース

// Zipファイル解凍サンプル
// sample.zipの中身を書庫名のディレクトリを作ってその中に全て解凍するサンプルです。
import java.io.*;
import java.util.*;
import org.apache.commons.compress.archivers.zip.*;
 
public class ZipKaitouSample {
 
  public static void main(String[] args) throws Exception {
 
    // 処理する書庫ファイル名「sample.zip」固定
    String sampleZip = "sample.zip";
 
    // ZipFileオープン
    // 文字コードはシステムデフォルトの文字コードにしておきます
    // Windows7だとMS932でした
    ZipFile zipFile = new ZipFile(sampleZip, System.getProperty("file.encoding"));
    // エントリ取得
    Enumeration<? extends ZipArchiveEntry> entries = zipFile.getEntries();
    byte[] b = new byte[500];
    // 書庫名をベーズディレクトリにします
    String baseDir = sampleZip.substring(0, sampleZip.length() - 4);
 
    // エントリの数だけループ
    while (entries.hasMoreElements()) {
      // ZipArchiveEntryを取得
      ZipArchiveEntry ze = entries.nextElement();
      // ディレクトリは処理しません
      if (ze.isDirectory())
        continue;
      // ベースディレクトリ+ZipArchiveEntry.getNameで出力パスを作ります
      File f = new File(baseDir + File.separator + ze.getName());
      // 親ディレクトリを取得
      File p = f.getParentFile();
      // ディレクトリが存在しない場合、ディレクトリを作成します
      if (!p.exists()) {
        p.mkdirs();
      }
 
      // エントリからInputStreamを取得
      InputStream is = zipFile.getInputStream(ze);
      BufferedInputStream bis = new BufferedInputStream(is);
 
      // 出力用のファイルストリーム作成
      FileOutputStream fo = new FileOutputStream(f);
      BufferedOutputStream bo = new BufferedOutputStream(fo);
 
      // InputStreamから読みだした分を順次ファイルに出力
      int size = 0;
      while ((size = bis.read(b)) > 0) {
        bo.write(b, 0, size);
      }
      // クローズします
      bo.close();
 
      // 処理したファイルを、ファイル名+圧縮ファイルサイズ+解凍ファイルサイズの形式で標準出力
      System.out.printf("%s %,3d => %,3d\n", ze.getName(), ze.getCompressedSize(), ze.getSize());
    }
  }
}
 

サンプルダウンロード


コメント

名前:

添付ファイル