簡體   English   中英

Java:創建GZIPInputStream時出錯:不是GZIP格式

[英]Java: Error creating a GZIPInputStream: Not in GZIP format

我正在嘗試使用以下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);

Joop似乎在那里有解決方案,但我覺得我必須補充一點:一般壓縮,特別是GZIP會產生二進制流。 一定不要嘗試從這種流創建一個字符串-它打破。

如果你需要將它帶到純文本表示,請查看Base64編碼,十六進制編碼,heck,甚至是簡單的二進制編碼。

簡而言之,String對象用於人類閱讀的內容。 字節數組(和許多其他東西)是機器讀取的東西。

您使用默認平台編碼將baostream編碼為字符串,可能是UTF-8。 您應該使用baostream.getBytes()來處理二進制數據,而不是字符串。

如果你堅持使用字符串,請使用8位編碼,eh baostream.toString(“ISO-8859-1”),並使用相同的字符集將其讀回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM