我正在尝试使用以下Java代码来压缩和解压缩String。但是,从新的ByteArrayInputStream对象创建新GZipInputStream对象的行会抛出“java.util.zip.ZipException:Not in GZIP format”异常。有谁知道如何解决这个问题?
String orig = ".............";
// compress it
ByteArrayOutputStream baostream = new ByteArrayOutputStream();
OutputStream outStream = new GZIPOutputStream(baostream);
outStream.write(orig.getBytes());
outStream.close();
String compressedStr = baostream.toString();
// uncompress it
InputStream inStream = new GZIPInputStream(new ByteArrayInputStream(compressedStr.getBytes()));
ByteArrayOutputStream baoStream2 = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int len;
while((len = inStream.read(buffer))>0)
baoStream2.write(buffer, 0, len);
String uncompressedStr = baoStream2.toString();
答案 0 :(得分:9)
混合String
和byte[]
;这绝不适合。并且仅适用于具有相同编码的相同OS。并非每个byte[]
都可以转换为String
,转换回来可以提供其他字节。
compressedBytes
不需要代表字符串。
在getBytes
和new String
明确设置编码。
String orig = ".............";
// Compress it
ByteArrayOutputStream baostream = new ByteArrayOutputStream();
OutputStream outStream = new GZIPOutputStream(baostream);
outStream.write(orig.getBytes("UTF-8"));
outStream.close();
byte[] compressedBytes = baostream.toByteArray(); // toString not always possible
// Uncompress it
InputStream inStream = new GZIPInputStream(
new ByteArrayInputStream(compressedBytes));
ByteArrayOutputStream baoStream2 = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int len;
while ((len = inStream.read(buffer)) > 0) {
baoStream2.write(buffer, 0, len);
}
String uncompressedStr = baoStream2.toString("UTF-8");
System.out.println("orig: " + orig);
System.out.println("unc: " + uncompressedStr);
答案 1 :(得分:4)
Joop似乎有解决方案,但我觉得我必须添加这个: 一般压缩,特别是GZIP会产生二进制流。 您必须尝试从此流构建一个String - 它将中断。
如果您需要将其转换为纯文本表示,请查看Base64编码,十六进制编码,即使是简单的二进制编码。
简而言之,String对象适用于人类阅读的内容。字节数组(和许多其他东西)是机器读取的东西。
答案 2 :(得分:0)
您使用默认平台编码将baostream编码为字符串,可能是UTF-8。您应该使用baostream.getBytes()来处理二进制数据,而不是字符串。
如果你坚持使用字符串,请使用8位编码,e.h。 baostream.toString(“ISO-8859-1”),并使用相同的字符集将其读回。