Java:创建GZIPInputStream时出错:不是GZIP格式

我正在尝试使用以下Java代码来压缩和解压缩String。 但是,从新的ByteArrayInputStream对象创建新GZipInputStream对象的行会抛出“java.util.zip.ZipException:Not in GZIP format”exception。 有谁知道如何解决这个问题?

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(); 

混合Stringbyte[] ; 这绝不适合。 并且仅适用于具有相同编码的相同操作系统。 并非每个byte[]都可以转换为String ,转换回来可以提供其他字节。

compressedBytes不需要表示String。

getBytesnew 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); 

Joop似乎有解决方案,但我觉得我必须补充一点:压缩一般,特别是GZIP会产生二进制流。 你不能尝试从这个流构造一个字符串 – 它会破坏。

如果您需要将其转换为纯文本表示,请查看Base64编码,hex编码,即使是简单的二进制编码。

简而言之,String对象是人类阅读的东西。 字节数组(和许多其他东西)是机器读取的东西。

您使用默认平台编码将baostream编码为字符串,可能是UTF-8。 您应该使用baostream.getBytes()来处理二进制数据,而不是字符串。

如果你坚持使用字符串,请使用8位编码,eh baostream.toString(“ISO-8859-1”),并使用相同的字符集将其读回。