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.