Написание файла GZIP с помощью nio - PullRequest
0 голосов
/ 22 февраля 2012

Это мой код:

WritableByteChannel channel = null;
GZIPOutputStream out = null;
try {
     channel = Channels.newChannel(new FileOutputStream("C:\\temp\\111.zip"));

     out = new GZIPOutputStream(Channels.newOutputStream(channel));
    for (long i = 0; i < 10000000000; i++) {    
       out.write(("string" + i + "\n").getBytes());
     } 

   } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (channel != null) {
                channel.close();
            }
        } catch (Exception e) {
        }
        try {
            if (out != null) {
                out.close();
            }
        } catch (Exception e) {
        }
    }    }

Я получаю zip, но его содержимое повреждено.

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Я бы сделал:

GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream("C:\\temp\\111.gz"));
WritableByteChannel out = Channels.newChannel(gzipOS);

И просто используйте out.write(), чтобы писать, используя NIO. Не забудьте закрыть ресурсы позже.

1 голос
/ 22 февраля 2012

Когда вы вызываете out.close (), он также закрывает основной поток / канал.

Если вы сначала закроете базовый канал, буферизованные данные или нижний колонтитул не будут записаны.

Формат GZIP содержит CRC32, который должен быть в конце и не может быть записан до тех пор, пока вы не закроете поток, и я ожидаю, что он отсутствует, поэтому содержимое файла не может быть проверено. Самое простое решение - не закрывать основной канал самостоятельно.

Кстати: как правило, лучше всего закрывать ресурсы в обратном порядке их создания. ;)

1 голос
/ 22 февраля 2012

Почему вы сохраняете его в формате zip, если используете поток gzip? Используйте .gz в качестве расширения.

Редактировать
Предполагая, что это не расширение .zip по вине (здесь все равно плохо):

  1. Вам, вероятно, следует подумать о том, чтобы позвонить out.finish(), прежде чем закрывать его.
  2. Я уверен, что вам не нужны все канальные вещи. Вы можете просто передать FileOutputStream в GZIPOutputStream
...