Javaサンプルコード辞典

ZipInputStream - ZIP形式のファイルを展開する

Zip形式のファイルを展開するサンプルコードです。ZIP形式のファイルの展開は「java.util.zip.ZipInputStream」を「FileInputStream」に連結して行います。

「ZipInputStream」は「FileInputStream」など他の入力ストリームに接続して使用します。ZIPファイルに含まれるファイルは「ZipEntry」クラスとして、「ZipInputStream」から取得することができます。Zipエントリの取出しは、getNextEntry()メソッド行います。エントリを取り出したら、read()メソッドでそのエントリからデータを読みます。読み取りがエントリの終端に達したら、-1が返されます。ZipEntryクラスのgetName()メソッドで返されるエントリ名は上位階層のディレクトリを含む、相対パスになっています。ディレクトリ構成を復元する場合は、あらかじめディレクトリを作成しておく必要があります。ZipEntryの名前に日本語が含まれていた場合は、文字化けが発生します。これはZipEntryの名称が強制的にUnicodeとして扱われるためです。
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.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

//コマンドライン第1引数に指定されたZIPファイルを第2引数に指定された
//ディレクトリに解凍する。
//コマンドライン第1引数:[解凍するZIPファイルのパス]
//コマンドライン第2引数:[解凍先ディレクトリのパス]
//注意! ZIPファイルにエントリされているファイル名に日本語が含まれている場合は、
//IllegalArgumentExceptionが発生します。
public class UnzipFile {

      public static void main(String[] args) {
            
            System.out.println("--処理開始--");
            
            //コマンドライン引数が入力されているかチェックを行う
            if(args.length < 2)
            {
                  System.out.println("コマンドライン引数を指定してください");
                  return;
            }
            
            ZipInputStream in = null;      //ZIPファイル読込み用ストリーム
            BufferedOutputStream out = null;      //解凍ファイル出力用ストリーム
            
            try
            {
                  //コンストラクタの引数には、読み込むZIPファイルのパスを指定する
                  in = new ZipInputStream(new BufferedInputStream(new FileInputStream(args[0])));
                  
                  ZipEntry zipEntry = null;      //ZIPファイルから取り出したエントリを格納する変数
                  int data = 0;      //読込んだバイトを格納する変数
                  
                  //ZIPファイルの次のエントリの先頭にストリームを移動する
                  //ZIPファイルの終端に達したらNULLが返却されるのでループを抜ける
                  while( (zipEntry = in.getNextEntry()) != null )
                  {
                        //圧縮されているファイルのパスを標準出力に表示する
                        System.out.println(zipEntry.getName());            
                        
                        //ZIPファイルにディレクトリ構成で圧縮されている場合を考慮して、
                        //出力先ディレクトリ以下に子ディレクトリを作成しておく
                        //これをやらないとエラーになります。
                        new File(args[1] + "\\" + zipEntry.getName()).getParentFile().mkdirs();
                        
                        //ZIPファイル内のエントリをファイルに出力するストリームを生成する
                        out = new BufferedOutputStream(new FileOutputStream(args[1] + "\\" + zipEntry.getName()));
                        
                        //1バイトずつ、エントリから読み込んで、展開先ファイルに出力する
                        while( (data = in.read()) != -1 )
                        {
                              out.write(data);
                        }
                        
                        //現在のZIPエントリを閉じる
                        in.closeEntry();
                        
                        //出力ストリームを閉じる
                        out.close();
                        out = null;
                  }
                  
            }
            //読み込み対象ファイルが存在しなかった場合
            catch(FileNotFoundException e)
            {
                  System.out.println(e);
            }
            //入出力エラー()が発生した場合
            catch(IOException e)
            {
                  System.out.println(e);
            }
            //その他例外が発生した場合
            catch(Exception e)
            {
                  System.out.println(e);
                  e.printStackTrace();
            }
            //例外発生時にも確実にリソースが開放されるように
            //close()の呼び出しはfinallyブロックで行う。
            finally
            {
                  if(in != null)
                  {
                        try
                        {
                              in.close();
                        }catch(Exception e){ System.out.println(e); }
                  }
                  
                  if(out != null)
                  {
                        try
                        {
                              out.close();
                        }catch(Exception e){ System.out.println(e); }
                  }
            }
            
            System.out.println("--処理終了--");

      }
}

(2007年11月3日)  

 ちょっと一休み. Javaキーワード並び替えゲーム

画面に表示される文字列を並び替えるとJavaに関連するキーワードになります。ヒントをたよりに並び替えを行ってエンターを押してください。 ユーザ登録をしてログインするとランキングに参加できます。
Flex Tips

DWRでリッチなWebページを作る!

Java Tips  java.io 編

Java Tips  java.lang 編