ZipGet.java



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

/** zip形式のファイルから目的のファイル名の内容を取り出して保存する ZipGet */

public class ZipGet {

  /** zip形式のファイル */

     public static ZipFile zf;

  /** データの読み込み終了を表す定数 */

     public static final int EOF = -1;

  /** 最初に呼び出される処理 */

     public static void main( String argv[] ) {

          Enumeration enum;

          if( argv.length == 2 ) {
              try {
                   zf = new ZipFile( argv[0] );
                   enum = zf.entries();

                   boolean foundFlag = false;
                   while( enum.hasMoreElements() ) {

                         ZipEntry target = (ZipEntry)enum.nextElement();
                         if( target.getName().equals( argv[1] ) ) {
                             saveEntry( target );
                             foundFlag = true;
                             break;
                         }
                   }
                   if( !foundFlag )
                         System.out.println( "target file not found in the zipfile" );
              }
              catch( FileNotFoundException e ){
                     System.out.println( "zipfile not found" );
              }
              catch( ZipException e ){
                     System.out.println( "zip error..." );
              }
              catch( IOException e ){
                     System.out.println( "IO error..." );
              }
         }
         else {
               System.out.println( "Usage:java ZipGet zipfile targetname" );
         }
   }

  /** 与えられた ZipEntry の内容を表示する */

     public static void saveEntry( ZipEntry target )
                                   throws ZipException,IOException {

            try {
                 File file = new File( target.getName() );
                 InputStream is = zf.getInputStream( target ); 
                 BufferedInputStream bis = new BufferedInputStream( is );

                 File dir = new File( file.getParent() );
                 dir.mkdirs();  // ディレクトリをリカーシブに作成する
                 FileOutputStream fos = new FileOutputStream( file );
                 BufferedOutputStream bos = new BufferedOutputStream( fos );

                 int c;
                 while( ( c = bis.read() ) != EOF ) {
                      bos.write( (byte)c );
                  }
                  zf.close();
                  bos.close();
                  fos.close();
            }
            catch( ZipException e ){
                   throw e;
            }
            catch( IOException e ){
                   throw e;
            }
      }
}