GZIP сжатие и декомпрессия

Я использую следующий код для сжатия, а затем распаковать строку. Но я получаю другую длину строки после распаковки, в распакованной строке также отсутствует несколько символов.

Сжатие:

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            GZIPOutputStream zos = new GZIPOutputStream(baos);

            zos.write(text.getBytes());
            zos.finish();
            zos.flush();

            byte[] udpBuffer = baos.toByteArray();          
            System.out.println("Compressed length: " + udpBuffer.length);

Декомпрессия:

        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
        BufferedReader br = new BufferedReader(new InputStreamReader(gis));     

        StringBuilder sb = new StringBuilder();
        while (br.readLine()!= null) {
            sb.append(br.readLine());
        }

        System.err.println(sb.toString());

Оригинальная длина текста: 45627 байт
Длина сжатого текста: 3732 байта
Длина текста без сжатия: 20328 байт (должна быть равна длине оригинала)

Мой оригинальный текст выглядит примерно так:

<html>
<head>
   <title></title>
</head>
<body>
<p><span class="preheader" style="display:none!important;mso-hide:all">Hey wazzup? </span></p>

<table align="center" border="0" cellpadding="0" cellspacing="0" width="640">
   <tbody>
       <tr>
           <td align="center" height="30" style="font-size:11px;color:#333;font-family:Verdana,Geneva,sans-serif">
.
.
.
</tbody>
</body>
</html>

И мой распакованный текст выглядит так (см. Стартовый тег отсутствует, а также

<title> tag, similarly many tags and other parts are missing from my uncompressed text:
<head></head><p><span class="preheader" style="display:none!important;mso-hide:all">
.
.
.

Кто-нибудь может указать на ошибку? Или это ожидаемое поведение?

1 ответ

Решение

+ Изменить

while (br.readLine()!= null) {
    sb.append(br.readLine());
}

в

String line;
while ((line = br.readLine()) != null) {
    sb.append(line);
}

Кроме того, zos.flush() должен быть вызван перед zos.finish().

Другие вопросы по тегам