Java:创建GZIPInputStream时出错:不是GZIP格式
我尝试使用以下Java代码压缩和解压缩字符串。但是,从新的ByteArrayInputStream对象创建新的GZipInputStream对象的行抛出了一个“java.util.zip.ZipException:Not in GZIP格式”异常。有人知道如何解决这个问题吗Java:创建GZIPInputStream时出错:不是GZIP格式,java,compression,gzip,gzipinputstream,Java,Compression,Gzip,Gzipinputstream,我尝试使用以下Java代码压缩和解压缩字符串。但是,从新的ByteArrayInputStream对象创建新的GZipInputStream对象的行抛出了一个“java.util.zip.ZipException:Not in GZIP格式”异常。有人知道如何解决这个问题吗 String orig = "............."; // compress it ByteArrayOutputStream baostream = new Byt
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();
您使用默认的平台编码(可能是UTF-8)将baostream编码为字符串。您应该使用baostream.getBytes()处理二进制数据,而不是字符串
如果您坚持使用字符串,请使用8位编码,例如baostream.toString(“ISO-8859-1”),并使用相同的字符集将其读回。混合
字符串和字节[]
;那不合适。并且只在具有相同编码的相同操作系统上工作。并非每个字节[]
都可以转换为字符串
,而转换回的字节可能会产生其他字节
压缩字节不需要表示字符串
在getBytes
和newstring
中显式设置编码
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);
Joop似乎有解决方案,但我觉得我必须补充一点:
一般来说,压缩,特别是GZIP将产生一个二进制流。
不能尝试从此流构造字符串-它将中断
如果需要将其转换为纯文本表示,请查看Base64编码、十六进制编码、heck,甚至简单的二进制编码
简言之,字符串对象用于人类阅读的东西。字节数组(以及其他许多东西)是机器可以读取的。即使两端都有指定的字符编码,将字节直接存储到字符串中也会变得很危险。使用字符串的更好方法可能是使用二进制数据的Base64编码。Apache Commons codec为UTF-8提供了一个非常好的类,而且UTF-8肯定是一种8位编码。“8位编码”的通俗含义是每个代码单元正好是8位,而在ascii码点以上的UTF-8中,情况绝对不是这样。但是,是的,编码的滥用会间接导致术语的滥用,您对base64编码的建议要好得多。