Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:创建GZIPInputStream时出错:不是GZIP格式_Java_Compression_Gzip_Gzipinputstream - Fatal编程技术网

Java:创建GZIPInputStream时出错:不是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

我尝试使用以下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();

您使用默认的平台编码(可能是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编码的建议要好得多。