java http gzip gzipinputstream

java - GZIPInputStream a la cadena



http (7)

Debería haber obtenido la respuesta como un InputStream lugar de como un byte[] . Luego puede descomprimirlo usando GZIPInputStream y leerlo como datos de caracteres usando InputStreamReader y finalmente escribirlo como datos de caracteres en una 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(); } // ...

Ver también:

Si su intención final es analizar la respuesta como HTML, le recomiendo que use un analizador HTML para esto como Jsoup . Entonces es tan fácil como:

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

En primer lugar, lo siento si mi terminología es un poco amateur, intenta soportarme;)

Estoy intentando convertir el cuerpo comprimido de una respuesta HTTP a texto sin formato. Tomé la matriz de bytes de esta respuesta y la convertí a ByteArrayInputStream. Luego lo convertí en un GZIPInputStream. Ahora quiero leer el GZIPInputStream y almacenar el cuerpo de respuesta HTTP descomprimido final como una cadena de texto sin formato.

Este código almacenará los contenidos finales descomprimidos en un OutputStream, pero quiero almacenar los contenidos como una Cadena:

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); }


Para decodificar bytes de un InputStream, puede usar un InputStreamReader . Entonces, un BufferedReader le permitirá leer su flujo línea por línea.

Tu código se verá así:

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); }



Usa Apache Commons para convertir GzipInputStream en 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 convertir contenido de matriz de bytes sin comprimir a String, haga algo como esto:

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


Use el modismo try-with-resources (que cierra automáticamente los recursos abiertos en try (...) al salir del bloque) para hacer que el código sea más limpio.

Use Apache IOUtils para convertir InputStream a String usando el CharSet predeterminado.

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); } }



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 } }