2011-08-05 20 views
1

フォルダに含まれるさまざまな種類のファイルを圧縮/解凍する必要があります。そのフォルダのサイズは10-11 GBを超える場合があります。 次のコードを使用しましたが、データを圧縮するのに時間がかかります。Javaで大きなサイズのデータ​​を圧縮および解凍するには?

BufferedReader in = new BufferedReader(new FileReader("D:/ziptest/expansion1.MPQ")); 
BufferedOutputStream out = new BufferedOutputStream(
    new GZIPOutputStream(new FileOutputStream("test.gz"))); 

int c; 
while ((c = in.read()) != -1) 
    out.write(c); 
in.close(); 
out.close(); 

私にJavaでいくつかの高速圧縮・解凍ライブラリを提案してください、私はまた、このような100メガバイトのチャンクごとのように、さまざまな部分で大きなファイルを分割したいです。

+2

Blizzard MoPaQファイルを圧縮しようとしている場合は、圧縮率はあまり高くありません。ファイル形式はすでに圧縮されています。 – Qwerky

答えて

7

Reader/Writerはテキスト専用です。これらのバイナリを読み込もうとすると破損します。

代わりにFileInputStreamを使用することをお勧めします。データをコピーする最も速い方法は、独自のバッファを使用することです。

InputStream in = new FileInputStream("D:/ziptest/expansion1.MPQ"); 
OutputStream out = new GZIPOutputStream(
      new BufferedOutputStream(new FileOutputStream("test.gz"))); 

byte[] bytes = new byte[32*1024]; 
int len; 
while((len = in.read(bytes)) > 0) 
    out.write(bytes, 0, len); 

in.close(); 
out.close(); 

あなたはバイトの大きな塊を読んで以来、一つのコピーを削除するよう/ OuptuStreamをBufferedInputしない方が効率的です。 GZIPOutputStreamの後にBufferedOutptuStreamがあります。これは、生成するデータのサイズを制御できないためです。

BTW:これをJavaでのみ読んでいるのであれば、少し速くて小さなDeflatorOutputStreamを使うことができますが、Java AFAIKでのみサポートされています。

+4

一度に1つではなく読み込みチャンクが1つではなく、大量のパフォーマンスが向上します(桁違いに速い)。 – Qwerky

関連する問題