Сжатие и распаковка данных большого размера в Java? - PullRequest
1 голос
/ 05 августа 2011

Мне нужно сжимать / распаковывать файлы разных типов, которые содержатся в папке, размер этой папки может превышать 10-11 ГБ. Я использовал следующий код, но сжатие данных занимает много времени.

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 МБ каждая.

1 Ответ

8 голосов
/ 05 августа 2011

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();

Поскольку вы читаете большие куски байтов, более эффективно не использовать BufferedInput / OuptuStream, поскольку при этом удаляется одна копия.После GZIPOutputStream существует BufferedOutptuStream, поскольку вы не можете контролировать размер создаваемых им данных.

Кстати: если вы только читаете это с Java, вы можете использовать DeflatorOutputStream, он немного быстрее и меньше, но поддерживается толькоJava AFAIK.

...