2009年11月09日

【Commons】Compressでgzip,bzip2の解凍

昨日はzip用のコードを書いたので、今日はgzipとbzip2用。

Windowsで動かしてみたところ、実行速度はCygwinでコマンド使うよりも数倍遅い感じ。

具体的には5MBのbzip2を解凍するのに12秒、gzipだとなぜか22秒もかかる。ちなみにBufferedInputStream使っても、byte[8192]とか用意しても、時間は変わらない。

同サイズのファイル出力にかかる時間は1秒程度なので、解凍処理が遅いように見えるけど、どうなんだろう。こちらのコードがおかしかったりするだろうか?


// JRE 1.6.0_07
// Commons Compress 1.0
// Commons IO 1.4
// org.apache.commons.compress.compressors.CompressorInputStream



/**
* gzip, bzip2の解凍を行う
* @param filePath 解凍するファイルのパス
* @param type 解凍ファイルの形式(gz or bzip2)
* @throws FileNotFoundException
* @throws IOException
* @throws CompressorException
*/
public static void uncompressCompressor( String filePath, String type )
throws FileNotFoundException, IOException, CompressorException {

InputStream is = null;
OutputStream os = null;

try {
// InputStream生成
is = new CompressorStreamFactory().createCompressorInputStream(
type, new FileInputStream( filePath ) );

// 出力パスは拡張子を取ったものにする
String writeFilePath = FilenameUtils.getPath( filePath ) +
FilenameUtils.getBaseName( filePath );

// ファイルの読み込みと書き込み
os = new BufferedOutputStream( new FileOutputStream( writeFilePath ) );
int i;
while( ( i = is.read() ) != -1 ) {
os.write( i );
}
} finally {
// close処理
IOUtils.closeQuietly( is );
IOUtils.closeQuietly( os );
}
}