J'obtiens une erreur étrange lorsque j'essaie d'utiliser des opérations en streaming pour compresser et décompresser les données String. Exactement, les informations d'erreur dans la console pointent vers «InflaterInputStream.read ()» dans mon «decompress ()».

java.util.zip.ZipException: incorrect header check
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:122)
at mytest.decorator.demo.CompressionDecorator.decompress(CompressionDecorator.java:98)

Cependant, je trouve que c'est OK si je n'utilise PAS d'opérations streamées dans mon 'compress ()'. Je pense donc que le problème est dû aux opérations en continu. Qu'est-ce qui ne va pas? Quelqu'un peut il m'aider avec ça ?

Merci beaucoup.

Mon code comme suit:

private String compress(String strData) {
    byte[] result = strData.getBytes();
    Deflater deflater = new Deflater(6);
    
    boolean useStream = true;
    
    if (!useStream) {
        byte[] output = new byte[128];
        deflater.setInput(result);
        deflater.finish();
        int compressedDataLength = deflater.deflate(output);
        deflater.finished();

        return Base64.getEncoder().encodeToString(output);
    }
    else {
        ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
        DeflaterOutputStream dfOut = new DeflaterOutputStream(btOut, deflater);
        try {
            dfOut.write(result);

            dfOut.close();
            btOut.close();
            return Base64.getEncoder().encodeToString(result);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

private String decompress(String strData) {
    byte[] bts = Base64.getDecoder().decode(strData);
    ByteArrayInputStream bin = new ByteArrayInputStream(bts);
    InflaterInputStream infIn = new InflaterInputStream(bin);
    ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
    
    try {
        int b = -1;
        while ((b = infIn.read()) != -1) {
            btOut.write(b);
        }
      
        bin.close();
        infIn.close();
        btOut.close();

        return new String(btOut.toByteArray());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
0
LLL Yao 18 févr. 2021 à 13:51

1 réponse

Meilleure réponse

Trouvez la cause principale.

Le contenu du tableau d'octets «résultat» n'est PAS modifié. Donc, cela ne fonctionne pas si vous utilisez 'result' car les données String ne sont pas compressées en fait.

L'utilisation correcte est 'ByteArrayOutputStream.toByteArray ()' dans 'compress ()' comme suit:

//btOut.close();
//return Base64.getEncoder().encodeToString(result);

return Base64.getEncoder().encodeToString(btOut.toByteArray());
0
LLL Yao 18 févr. 2021 à 14:14