如何在Java中解压缩调用API响应?

问题描述

我想解压缩API响应(标头:Accept-encoding=gzip)。

这是我尝试过的行,但由于以下原因始终失败:

java.util.zip.ZipException: Not in GZIP format

String entity = response.readEntity(String.class); 
// When I print "entity" I will get Compress message as below:
��{o�ʒ��
���c^MC��������ut4"�ms���fWGگ�_o?�V�G�ę�=�PF�3��i�������ɚ���G�[�eEA����$��M�(�rW�nk��97�m�r��6�$�$T�a^ZaIj�"�5U�4�����4:oW�C{�-��A�c0�hސ�*l���JP�ƚ.������t�
}ˏ�r�kIxjk��!���m�0��Z�9    ���r[�����6!٦^fQ�X_d)hބe���m��\RP�Y��Xg�:�F�IEE�5]U��f�\jϋ�?N�ߖ�<�κ;�+��j�xQ�{����40�]4N�NOib�=o(r�mL�rLϱ�>Rۖ�l4
{2jʁk��f�*�љw��a�l���������^�V�a�ӱ���w[2�V>n��'��n���;�ȧ�#�p-ch}<>�9>�IB�~X��X���=��lz9)H��2#O?�R����*�����q�c�V�t����c�ܩ<��A��[���4
��

byte[] input = entity.getBytes(); 

// helper method
public static String decompress(byte[] compressed) throws IOException {
        ByteArrayInputStream bis = new ByteArrayInputStream(compressed);
        // Always failed at "GZIPInputStream" line due to java.util.zip.ZipException: Not in GZIP format        
        GZIPInputStream gis = new GZIPInputStream(bis); 
        BufferedReader br = new BufferedReader(new InputStreamReader(gis,"UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line;
        while((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        gis.close();
        bis.close();
        return sb.toString();
    }

解决方法

您的问题出在调用decompress()之前的代码中,因此您应该编辑问题以显示如何获得此流。

解决后,您会发现decompress()会删除行尾,从而使结果字符串在一行上。这可能无效-取决于您正在阅读的格式。

如果需要保留UTF-8编码的GZIP字符串的格式,则可以用StringWriter替换BufferedReader和StringBuilder,如下所示:

public static String decompress(byte[] compressed) throws IOException {
    try(GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(compressed));
        InputStreamReader r = new InputStreamReader(gis,"UTF-8"))
    {
        StringWriter sb = new StringWriter(compressed.length * 3 / 2);
        r.transferTo(sb);
        return sb.toString();
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...