web-dev-qa-db-fra.com

GZIPInputStream to String

Tout d'abord, je suis désolé si ma terminologie est un peu amateur, essayez de supporter avec moi;)

J'essaie de convertir le corps d'une réponse HTTP gzippée en texte en clair. J'ai pris le tableau d'octets de cette réponse et l'ai converti en ByteArrayInputStream. J'ai ensuite converti cela en un GZIPInputStream. Je veux maintenant lire GZIPInputStream et stocker le corps de réponse HTTP décompressé final en tant que chaîne de texte en clair.

Ce code stockera le contenu final décompressé dans un OutputStream, mais je veux stocker le contenu en tant que chaîne:

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

Pour décoder les octets d'un InputStream, vous pouvez utiliser un InputStreamReader . Ensuite, un BufferedReader vous permettra de lire votre flux ligne par ligne.

Votre code ressemblera à:

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

Vous devriez plutôt avoir obtenu la réponse sous la forme InputStream au lieu de byte[]. Vous pouvez ensuite décompresser le fichier avec GZIPInputStream et le lire sous forme de données de caractère à l'aide de InputStreamReader , puis l'écrire en tant que données de caractère dans un String à l'aide de 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();
}

// ...

Voir également:


Si votre intention finale est d’analyser la réponse au format HTML, il est vivement recommandé d’utiliser un analyseur HTML, comme Jsoup . C'est aussi simple que:

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

Utilisez l'idiome try-with-resources (qui ferme automatiquement toutes les ressources ouvertes dans try (...) à la sortie du bloc) pour nettoyer le code.

Utilisez Apache IOUtils pour convertir inputStream en String en utilisant CharSet par défaut.

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

Utilisez Apache Commons pour 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();
            }
        }

Pour convertir le contenu non compressé d'un tableau d'octets en chaîne, procédez comme suit:

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

Vous pouvez utiliser le StringWriter pour écrire dans 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

tu peux aussi faire 

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

AutoClosable est une bonne chose https://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

0
Alexander Byrd