GZIP压缩&减压问题

时间:2012-10-04 07:28:18

标签: java gzip compression

您好我正在使用GZIP压缩和解压缩字符串。

获得一些例外!请帮帮我!

protected byte[] CompressInputString(String input_string2)
        throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(
            input_string2.length());
    System.out.println("Byte Array OS : " + os);
    GZIPOutputStream gos = new GZIPOutputStream(os);
    System.out.println("GZIPOutputStream : " + gos);
    gos.write(input_string2.getBytes());
    System.out.println("GZIPOutputStream get bytes: "
            + input_string2.getBytes());
    gos.close();
    byte[] compressed = os.toByteArray();
    os.close();
    System.out.println("Compressed : " + compressed);
    return compressed;

}

protected String DecompressInputString(byte[] input_to_decode_from_function)
        throws IOException {
    final int BUFFER_SIZE = 32;
    ByteArrayInputStream is = new ByteArrayInputStream(input_to_decode_from_function);
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
    StringBuilder string = new StringBuilder();
    byte[] data = new byte[BUFFER_SIZE];
    int bytesRead;
    while ((bytesRead = gis.read(data)) != -1) {
        string.append(new String(data, 0, bytesRead));
    }
    gis.close();
    is.close();
    return string.toString();
}

我的输入是:abcdefghijklmnop

输出

GZIPOutputStream : java.util.zip.GZIPOutputStream@f38798
GZIPOutputStream get bytes: [B@4b222f
Compressed : [B@b169f8
Compressed File : [B@b169f8

要解压缩,我会给出什么输入?

如果我将[B@b169f8作为字符串输入并使用input.getBytes()将其转换为字节数组并将其传递给我的解压缩函数,则会引发异常

NOT IN GZIP FORMAL EXCEPTION LOG

3 个答案:

答案 0 :(得分:3)

  

如果我将[B @ b169f8作为字符串输入并使用INPUT.getBytes()将其转换为字节数组并将其传递给我的解压缩函数...异常提升

是的 - 因为“[B @ b169f8”实际上不是字节数组的内容。这只是在其上调用toString()的结果;它基本上表示了对象的类型及其哈希值。

如果要以无损方式将字节数组转换为字符串,则需要使用类似base64的内容。有许多库执行base64编码,包括this public domain one

此外,我强烈建议不要使用String.getBytes()String(byte[], int, int)构造函数。您应始终指定编码。读取数据的最简单方法是创建InputStreamReader包装GZIPInputStream,并直接从中读取文本数据。我建议使用UTF-8作为初始文本到二进制转换的编码(当然也在解压缩方面)。

答案 1 :(得分:0)

首先,您在字节数组上使用.toString()将字节数组转换为字符串,该数组返回其内存地址的表示形式,而不是其内容。

如果您确实需要将字符串数组作为字符串,则需要一种合理的方式将字节数组表示为字符串。 Base64是一种合理的方法。

然后,在将其送入充气机之前,您需要将其重新转换为字节数组。

或者,您可以跳过上述两个步骤并将字节数组保留为字节数组,并将其直接输入充气机。

答案 2 :(得分:0)

对我来说很好,我试过这样调用你的方法:

public static void main(String[] args) throws Throwable {
    Test tf = new Test();
    byte[] compressed = tf.CompressInputString("Jimmy");
    System.out.println(Arrays.toString(compressed));
    String s = tf.DecompressInputString(compressed);
    System.out.println(s);//Prints "Jimmy"

}

您是否可以添加一个如何调用方法的示例,以及任何异常的完整堆栈跟踪?