当前位置: 首页 > 知识库问答 >
问题:

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

籍永安
2023-03-14

我试图使用以下Java代码来压缩和解压字符串。但是,从一个新的ByteArrayInputStream对象创建一个新的GZipInputStream对象的那一行抛出了一个“java.util.zip.ZipException:Not in GZIP格式”异常。有人知道怎么解决这个问题吗?

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

共有3个答案

晏修诚
2023-03-14

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

如果您坚持使用字符串,请使用8位编码,即e.h.Bastream。toString(“ISO-8859-1”),并用相同的字符集读回。

谷良弼
2023-03-14

Joop似乎有解决方案,但我觉得我必须补充一点:一般来说,压缩,尤其是GZIP将产生一个二进制流。你不能试图从这个流中构造一个字符串——它会断开的。

如果您需要使用纯文本表示,请查看Base64编码、十六进制编码,甚至简单的二进制编码。

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

邢杰
2023-03-14

混合Stringbyte[];这永远不适合。并且只在具有相同编码的相同操作系统上工作。不是每个byte[]都可以转换为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);
 类似资料:
  • 问题内容: 我正在尝试使用以下Java代码来压缩和解压缩String。但是,从新的ByteArrayInputStream对象中创建新的GZipInputStream对象的行将引发“ java.util.zip.ZipException:不是GZIP格式”异常。有谁知道如何解决这个问题? 问题答案: 混合和; 那永远不适合。并且仅适用于具有相同编码的相同OS。并非每个都可以转换为,并且转换回可以提

  • 我一直在尝试实现解压以GZIP格式压缩的文本,下面是我实现的方法 现在我正在测试以下压缩文本的解决方案: 而且gzip格式也没有例外。我尝试了不同的方法,但仍然存在这个错误。也许有人知道我做错了什么?

  • 我有一个带有Spring Data JPA的Web应用程序。我为一些实体创建了扩展JpaRepository的存储库。但是,当我尝试部署应用程序时,会遇到以下错误。不知道为什么会抛出错误 应用程序错误日志: pom.xml 应用程序上下文.xml persistence.xml JpaRepostory接口

  • 找不到javac编译器;通用域名格式。太阳工具。javac。Main不在类路径上。也许JAVA_HOME没有指向JDK。当前设置为“C:\Program Files\Java\jre7”。解决方案是什么?

  • 我做了一个从Java到xls的导出,我使用POI库。 我的createCell方法: 我在一个For中调用这个方法,我有这样的消息错误: Echec de l'export:超出了单元格样式的最大数目。在.xls工作簿中最多可以定义4000个样式 如何重用我的单元格而不必重新创建每个迭代? THX

  • 我试图编译一个非常简单的程序,将包含3个用户的简单表保存到http://localhost/phpmyadmin,以清空名为,users ' '的数据库,但它仍然显示异常,您可以看到。 1个异常org.springframework.beans.factory。BeanCreationException:创建在类路径资源[org/springframework/boot/autoconfigure