压缩和解压缩java中的大型数据?

时间:2011-08-05 10:43:29

标签: java file-io compression gzip

我需要压缩/解压缩文件夹中包含的不同类型的文件,该文件夹的大小可能超过10-11 GB。 我使用了以下代码,但这需要很长时间来压缩数据。

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中使用一些快速压缩和解压缩库,我也希望将大文件分成不同的部分,例如每个100MB的块。

1 个答案:

答案 0 :(得分:8)

Reader / Writer仅适用于Text,如果您尝试读取二进制文件,则会损坏。

相反,我建议您使用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();

由于您读取大块字节,因此不使用BufferedInput / OuptuStream会更有效,因为这会删除一个副本。在GZIPOutputStream之后有一个BufferedOutptuStream,因为你无法控制它产生的数据的大小。

顺便说一句:如果你只是用Java阅读它,你可以使用DeflatorOutputStream,它稍微快一点,但只有Java AFAIK支持。