1. ホーム
  2. java

[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません

2022-01-30 07:23:18

質問

以下のJavaコードを使って、Stringを圧縮・解凍しようとしています。 しかし、新しいByteArrayInputStreamオブジェクトから新しいGZipInputStreamオブジェクトを作成する行は、 "java.util.zip.ZipExceptionを投げます。Not in GZIP format" 例外が発生します。 誰かこれを解決する方法を知っていますか?

        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[] しかし、それは決してフィットしません。また、同じOS、同じエンコーディングでなければ動作しません。すべての 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);