ti-enxame.com

GZIPInputStream para String

Primeiro de tudo, me desculpe se a minha terminologia é um pouco amador, tente suportar comigo;)

Eu estou tentando converter o corpo gzipped de uma resposta HTTP para texto simples. Tomei o array de bytes desta resposta e converti-o em um ByteArrayInputStream. Eu então converti isso para um GZIPInputStream. Agora eu quero ler o GZIPInputStream e armazenar o corpo da resposta HTTP descompactada final como uma String de texto simples.

Este código irá armazenar o conteúdo final descomprimido em um OutputStream, mas eu quero armazenar o conteúdo como uma String:

public static int sChunk = 8192;
ByteArrayInputStream bais = new ByteArrayInputStream(responseBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);
byte[] buffer = new byte[sChunk];
int length;
while ((length = gzis.read(buffer, 0, sChunk)) != -1) {
        out.write(buffer, 0, length);
}
31
Matt

Para decodificar bytes de um InputStream, você pode usar um InputStreamReader . Então, um BufferedReader permitirá que você leia seu fluxo linha por linha.

Seu código será parecido com:

ByteArrayInputStream bais = new ByteArrayInputStream(responseBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader in = new BufferedReader(reader);

String readed;
while ((readed = in.readLine()) != null) {
    System.out.println(readed);
}
46
Vivien Barousse

Você deve ter obtido a resposta como InputStream em vez de byte[]. Então você pode soltá-lo usando GZIPInputStream e lê-lo como dados de caractere usando InputStreamReader e finalmente escrevê-lo como dados de caractere em uma String usando StringWriter .

String body = null;
String charset = "UTF-8"; // You should determine it based on response header.

try (
    InputStream gzippedResponse = response.getInputStream();
    InputStream ungzippedResponse = new GZIPInputStream(gzippedResponse);
    Reader reader = new InputStreamReader(ungzippedResponse, charset);
    Writer writer = new StringWriter();
) {
    char[] buffer = new char[10240];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        writer.write(buffer, 0, length);
    }
    body = writer.toString();
}

// ...

Veja também:


Se a sua intenção final é analisar a resposta como HTML, então eu recomendo fortemente usar apenas um analisador de HTML para isso como Jsoup . Então é tão fácil quanto:

String html = Jsoup.connect("http://google.com").get().html();
32
BalusC

Use o idioma try-with-resources (que fecha automaticamente todos os recursos abertos em try (...) ao sair do bloco) para tornar o código mais limpo.

Use o Apache IOUtils para converter inputStream em String usando o CharSet padrão.

import org.Apache.commons.io.IOUtils;
public static String gzipFileToString(File file) throws IOException {
    try(GZIPInputStream gzipIn = new GZIPInputStream(new FileInputStream(file))) {
        return IOUtils.toString(gzipIn);
    }
}
5
Misam Abbas

Use o Apache Commons para converter GzipInputStream em byteArray. 

import Java.io.InputStream;
import Java.util.Zip.GZIPInputStream;
import org.Apache.commons.io.IOUtils;

public static byte[] decompressContent(byte[] pByteArray) throws IOException {
        GZIPInputStream gzipIn = null;
        try {
            gzipIn = new GZIPInputStream(new ByteArrayInputStream(pByteArray));
            return IOUtils.toByteArray(gzipIn);
        } finally {
            if (gzipIn != null) {
                gzipIn.close();
            }
        }

Para converter conteúdo descompactado de matriz de bytes em String, faça algo assim:

String uncompressedContent = new String(decompressContent(inputStream));
2
ChaitanyaBhatt

Você pode usar o StringWriter para gravar em String

1
Gopi
import Java.io.*;
import Java.util.Zip.*;

public class Ex1 {

    public static void main(String[] args) throws Exception{
        String str ;

        H h1 = new H();
        h1.setHcfId("PH12345658");
        h1.setHcfName("PANA HEALTH ACRE FACILITY");

        str = h1.toString();
        System.out.println(str);

        if (str == null || str.length() == 0) {
            return ;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream(str.length());
        GZIPOutputStream gzip = new GZIPOutputStream(out);
        gzip.write(str.getBytes());
        gzip.close();
        out.close();

        String s =  out.toString() ;
        System.out.println( s );
        byte[] ba = out.toByteArray();
        System.out.println( "---------------BREAK-------------" );

        ByteArrayInputStream in = new ByteArrayInputStream(ba);
        GZIPInputStream gzis = new GZIPInputStream(in);
        InputStreamReader reader = new InputStreamReader(gzis);
        BufferedReader pr = new BufferedReader(reader);

        String readed;
        while ((readed = pr.readLine()) != null) {
            System.out.println(readed);
        }

        //Close all the streams
    }

}
0
Pana Emp

você também pode fazer 

try (GZIPInputStream gzipIn = new GZIPInputStream(new ByteArrayInputStream(pByteArray)))
{
....
}

AutoClosable é uma coisa boa https://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

0
Alexander Byrd