Java 如何读取brotli压缩字符串?

Java 如何读取brotli压缩字符串?,java,http,jsoup,brotli,Java,Http,Jsoup,Brotli,我从一个网站上得到一个brotli压缩的json字符串。我想解压并阅读它 当我使用响应中的输入流时,我能够使用 new BufferedReader(new InputStreamReader(new BrotliInputStream(response.getEntity().getContent()))); 而当我将响应保存为字符串并读取它时 BufferedReader rd = new BufferedReader(new InputStreamReader(new BrotliInp

我从一个网站上得到一个brotli压缩的json字符串。我想解压并阅读它

当我使用响应中的输入流时,我能够使用

new BufferedReader(new InputStreamReader(new BrotliInputStream(response.getEntity().getContent())));
而当我将响应保存为字符串并读取它时

BufferedReader rd = new BufferedReader(new InputStreamReader(new BrotliInputStream(IOUtils.toInputStream(responseAsString, "UTF-8"))));
StringBuilder result = new StringBuilder();
String line = "";
while ((line = rd.readLine()) != null) {
    result.append(line);
}
System.out.println(result);
我得到以下例外:

Exception in thread "main" java.io.IOException: Brotli stream decoding failed
    at org.brotli.dec.BrotliInputStream.read(BrotliInputStream.java:167)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at com.brotli.test.BrotliStringTest.main(BrotliStringTest.java:113)
Caused by: org.brotli.dec.BrotliRuntimeException: Unused space
    at org.brotli.dec.Decode.readHuffmanCodeLengths(Decode.java:226)
    at org.brotli.dec.Decode.readHuffmanCode(Decode.java:296)
    at org.brotli.dec.HuffmanTreeGroup.decode(HuffmanTreeGroup.java:53)
    at org.brotli.dec.Decode.readMetablockHuffmanCodesAndContextMaps(Decode.java:528)
    at org.brotli.dec.Decode.decompress(Decode.java:621)
    at org.brotli.dec.BrotliInputStream.read(BrotliInputStream.java:161)
    ... 8 more
编辑1:


我尝试使用Jsoup,发现它只支持gzip流,在其HttpConnection类中不支持BrotliInputStream。有什么建议吗

我是这样解决的:-

import org.brotli.dec.BrotliInputStream;

if(response.getLastHeader("content-encoding").getValue().equals("br")) { // check if getting brotli compressed stream
    rd = new BufferedReader(new InputStreamReader(new BrotliInputStream(response.getEntity().getContent())));
}
else {
    rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
}

这适用于brotli/非brotli(gzip等)流。

但为什么您使用
BrotliInputStream的两个示例不相同?@ScaryWombat,在一个示例中,我直接从
HttpResponse
返回的
InputStream
读取,而在另一个示例中,我首先将字符串转换为
InputStream
以馈送到
BrotliInputStream
。当我特别尝试使用字符串时,这不起作用。