0

こんにちは、文字列の圧縮と解凍に GZIP を使用しています。

いくつかの例外を取得 ! 私を助けてください !

protected byte[] CompressInputString(String input_string2)
        throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(
            input_string2.length());
    System.out.println("Byte Array OS : " + os);
    GZIPOutputStream gos = new GZIPOutputStream(os);
    System.out.println("GZIPOutputStream : " + gos);
    gos.write(input_string2.getBytes());
    System.out.println("GZIPOutputStream get bytes: "
            + input_string2.getBytes());
    gos.close();
    byte[] compressed = os.toByteArray();
    os.close();
    System.out.println("Compressed : " + compressed);
    return compressed;

}

protected String DecompressInputString(byte[] input_to_decode_from_function)
        throws IOException {
    final int BUFFER_SIZE = 32;
    ByteArrayInputStream is = new ByteArrayInputStream(input_to_decode_from_function);
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
    StringBuilder string = new StringBuilder();
    byte[] data = new byte[BUFFER_SIZE];
    int bytesRead;
    while ((bytesRead = gis.read(data)) != -1) {
        string.append(new String(data, 0, bytesRead));
    }
    gis.close();
    is.close();
    return string.toString();
}

私の入力は次のとおりです。abcdefghijklmnop

出力は

GZIPOutputStream : java.util.zip.GZIPOutputStream@f38798
GZIPOutputStream get bytes: [B@4b222f
Compressed : [B@b169f8
Compressed File : [B@b169f8

解凍するには、どのような入力をすればよいですか?

文字列入力として入力し、 input.getBytes [B@b169f8() を使用してバイト配列に変換し、解凍関数に渡すと、例外が発生します

GZIP 正式な例外ログにありません

4

3 に答える 3

2

[B@b169f8 を文字列入力として PUT し、INPUT.getBytes() を使用してそれをバイト配列に変換し、解凍関数に渡すと ... 例外が発生します

そうです - "[B@b169f8" は実際にはバイト配列の内容ではないからです。それを呼び出した結果toString()です。基本的に、オブジェクトのタイプとそのハッシュを示しています。

バイト配列を無損失で文字列に変換したい場合は、base64 などを使用する必要があります。このパブリック ドメインのライブラリを含め、base64 エンコーディングを実行するライブラリは多数あります。

さらに、どちらかまたはコンストラクターを使用しないことを強くお勧めします。常にエンコーディングを指定する必要があります。データを読み取る最も簡単な方法は、ラップを作成し、そこから直接テキスト データを読み取ることです。最初のテキストからバイナリへの変換のエンコーディングとして UTF-8 を使用することをお勧めします (もちろん、解凍側でも)。String.getBytes()String(byte[], int, int)InputStreamReaderGZIPInputStream

于 2012-10-04T07:34:07.207 に答える
0

私にはうまくいきます。私はあなたのメソッドを次のように呼び出してみました:

public static void main(String[] args) throws Throwable {
    Test tf = new Test();
    byte[] compressed = tf.CompressInputString("Jimmy");
    System.out.println(Arrays.toString(compressed));
    String s = tf.DecompressInputString(compressed);
    System.out.println(s);//Prints "Jimmy"

}

メソッドの呼び出し方法の例と、例外の完全なスタック トレースを追加できますか?

于 2012-10-04T07:38:24.483 に答える
0

まず、バイト配列を使用してバイト配列を文字列に変換します.toString()。これは、その内容ではなく、メモリ アドレスの表現を返します。

間に文字列として本当に必要な場合は、バイト配列を文字列として表現する合理的な方法が必要になります。Base64 はこれを行うための合理的な方法です。

次に、インフレータに供給する前にバイト配列に戻す必要があります。

または、上記の 2 つの手順をスキップして、バイト配列をバイト配列として保持し、インフレータに直接フィードすることもできます。

于 2012-10-04T07:34:21.353 に答える