GunZip.java



package ziptool;

import java.io.*;
import java.util.zip.GZIPInputStream;

/** gzip形式に圧縮されたファイルを解凍する GunZip */

public class GunZip {

  /** ファイルの読み込みの終わりを表す定数 */

     protected static final int EOF = -1;

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

     public static void main( String argv[] ) {

          if( argv.length == 1 ) {
              try {

                // 識別子 .gz が省略された場合にも対応する
                   int n = argv[0].length();
                   String bodyName;
                   if( argv[0].regionMatches( n-3, ".gz", 0, 3 ) )
                       bodyName = argv[0].substring( 0, n-3 );
                   else
                       bodyName = argv[0];

                   File pressed = new File( bodyName + ".gz" );
                   boolean successFlag
                                = uncompressFile( pressed );
                   if( successFlag )
                       pressed.delete();  // 圧縮ファイルは消去
              }
              catch( FileNotFoundException e ){
                     System.err.println( "file not found" );
              }
              catch( IOException e ){
                     System.err.println( "IO error..." );
              }
         }
         else {
               System.err.println(
                         "Usage:java GZipCat gzipfile(.gz)" );
         }
   }

  /** 与えられたファイルを解凍する */

     public static boolean uncompressFile( File file )
                 throws FileNotFoundException,IOException {

          boolean flag = false;
          try {
               BufferedInputStream bis
                    = new BufferedInputStream(
                          new GZIPInputStream(
                             new FileInputStream( file ) ) );

               int n = file.getName().length();
               String bodyName = file.getName().substring( 0, n-3 );

               BufferedOutputStream bos
                    = new BufferedOutputStream(
                          new FileOutputStream(
                             new File( bodyName ) ) );

   /* 1バイト読み込んでは1バイト書き出すのはまずいように見えるが、
      実際にはバッファリングを自動的に行っているので問題ない      */
 
               int c;
               while( ( c = bis.read() ) != EOF ) {
                  bos.write( (byte)c );
               } 
               bis.close();
               bos.close();
               flag = true;
          }
          catch( FileNotFoundException e ){
                 throw e;
          }
          catch( IOException e ){
                 throw e;
          }
          return flag;
     }
}