Java: Error creating a GZIPInputStream: Not in GZIP format

前端 未结 3 2201
暖寄归人
暖寄归人 2020-12-17 23:39

I am trying to use the following Java code to compress and uncompress a String. But the line that creates a new GZipInputStream object out of a new ByteArrayInputStream obj

相关标签:
3条回答
  • 2020-12-18 00:22

    You encoded baostream to a string with your default platform encoding, probably UTF-8. You should be using baostream.getBytes() to work with binary data, not strings.

    If you insist on a string, use an 8-bit encoding, e.h. baostream.toString("ISO-8859-1"), and read it back with the same charset.

    0 讨论(0)
  • 2020-12-18 00:33

    Mixing String and byte[]; that does never fit. And only works on the the same OS with same encoding. Not every byte[] can be converted to a String, and the conversion back could give other bytes.

    The compressedBytes need not represent a String.

    Explicitly set the encoding in getBytes and 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);
    
    0 讨论(0)
  • 2020-12-18 00:33

    Joop seems to have the solution up there, but I feel I must add this: Compression in general, and GZIP in particular will produce a binary stream. You MUST not try to construct a String from this stream - it WILL break.

    If you need to take it to a plain text representation, look into Base64 encoding, hex encoding, heck, even simple binary encoding.

    In short, String objects are for things that humans read. Byte arrays (and many other things) are for things machines read.

    0 讨论(0)
提交回复
热议问题