您好我正在使用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()将其转换为字节数组并将其传递给我的解压缩函数,则会引发异常
答案 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"
}
您是否可以添加一个如何调用方法的示例,以及任何异常的完整堆栈跟踪?