Javaサンプルコード辞典

ZipOutputStream - ファイルをZIP形式で圧縮する

ファイルをZIP形式で圧縮するサンプルコードです。ZIP形式での圧縮は「java.util.zip.ZipOutputStream」を「FileOutputStream」に連結して行います。

「ZipOutputStream」は「FileOutputStream」など他の出力ストリームに接続して使用します。ZIPファイルに含めるファイルは「ZipEntry」クラスとして、「ZipOutputStream」に追加します。ZipEntryの追加はputNextEntry()メソッドでおこないます。putNextEntry()メソッドでエントリを追加してから、closeEntry()でエントリを閉じるまでの間に、write()メソッドでエントリのファイルの中身を出力ストリームに書き出します。エントリの名前には、ZIPファイルを展開するフォルダからの相対パスを指定します。ZIPファイルの中にディレクトリ構成を作りたい場合は、「A\B.txt」のように上位ディレクトリを含むパスをZipEntryのコンストラクタに指定します。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.ZipOutputStream;

//コマンドライン第1引数と第2引数に指定されたファイルを第3引数に指定された
//ZIPファイルに圧縮する。
//コマンドライン第1引数:[ZIPファイルに入れるファイル1のパス]
//コマンドライン第2引数:[ZIPファイルに入れるファイル2のパス]
//コマンドライン第3引数:[生成するZIPファイルのパス]
//注意! ZIPファイルにエントリするファイル名に日本語が含まれている場合は、
//文字化けが発生します。これはファイル名のエンコードUTF8で決め打ちされているためです。
//この問題を解決するためには[org.apache.tools.zip.ZipOutputStream]を利用する必要があります。
public class ZipFile {

      public static void main(String[] args) {
            
            System.out.println("--処理開始--");
            
            //コマンドライン引数が入力されているかチェックを行う
            if(args.length < 3)
            {
                  System.out.println("コマンドライン引数を指定してください");
                  return;
            }
            
            BufferedInputStream in = null;      //入力ファイル読み取り用ストリーム
            ZipOutputStream out = null;      //ZIPファイル出力用ストリーム
            
            try
            {
                  //ZIPファイルのパスを指定してZIP出力ストリームを生成する
                  out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(args[2])));
                  
                  //ZIPに追加する[ファイル1]を読み取る入力ストリームを生成する
                  in = new BufferedInputStream(new FileInputStream(args[0]));
                  
                  //ZIPファイルにエントリ1(ファイル1)を追加する
                  //ZipEntryのコンストラクタに指定するエントリ名には、
                  //解凍後の解凍先ディレクトリからの相対パスを指定します。
                  //今回は解凍先ディレクトリの直下にファイルを解凍したいので
                  //パスからファイル名を取得してそれをエントリ名にしています。
                  String entryName = new File(args[0]).getName();
                  out.putNextEntry(new ZipEntry(entryName));
                  
                  //入力ストリームからZIPファイルに追加するファイルの内容を読み取る
                  int data = 0;
                  while( (data = in.read()) != -1 )
                  {
                        //ZIPファイルを出力するストリームに対してwrite()する。
                        out.write(data);
                  }
                  
                  //入力ストリームを閉じる
                  in.close();
                  in = null;
                  
                  //エントリ1(ファイル1)を閉じる
                  out.closeEntry();
                  
                  //ZIPに追加する[ファイル2]を読み取る入力ストリームを生成する
                  in = new BufferedInputStream(new FileInputStream(args[1]));
                  
                  //ZIPファイルにエントリ2(ファイル2)を追加する
                  entryName = new File(args[1]).getName();
                  out.putNextEntry(new ZipEntry(entryName));
                  
                  //入力ストリームからZIPファイルに追加するファイルの内容を読み取る
                  data = 0;
                  while( (data = in.read()) != -1 )
                  {
                        //ZIPファイルを出力するストリームに対してwrite()する。
                        out.write(data);
                  }

                  //入力ストリームを閉じる
                  in.close();
                  in = null;
                  
                  //エントリ2(ファイル2)を閉じる
                  out.closeEntry();
                  
                  //ZIP出力ストリームを閉じる
                  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);
            }
            //例外発生時にも確実にリソースが開放されるように
            //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 編