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;
}
}