1. ホーム
  2. Exceptions

スレッド "main" で例外発生 java.util.zip.ZipException: GZIP形式ではありません

2022-02-09 17:43:31
<パス

私のアプリケーションでGZIPストリームを使用してデータを圧縮/解凍しようとしていますが、文字セット "ISO-8859-1" を使用しているときはすべてうまくいきますが、文字セットを "UTF-8" に変更すると、エラー メッセージ "Exception in thread "main" java.util.zip.ZipException: not in GZIP format" が発生しました。コードは以下の通りです。

<ブロッククオート

public static String compress(String str) throws IOException {...
if (str == null || str.length() == 0) {.
strを返します。
}
System.out.println("String length : " + str.length())を実行します。
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out)。
gzip.write(str.getBytes())を実行します。
gzip.close()を実行します。
String outStr = out.toString("UTF-8");
System.out.println("Output String lenght : " + outStr.length()) を実行します。
System.out.println("Output : " + outStr.toString())を実行します。
はoutStrを返します。
}

public static String decompress(String str) throws IOException {...
if (str == null || str.length() == 0) {...
strを返します。
}
System.out.println("Input String length : " + str.length())を実行します。
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(str.getBytes("UTF-8"))));
BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
文字列 outStr = "";
文字列の行
while ((line=bf.readLine())! =null){。
outStr += line;
}
System.out.println("Output String lenght : " + outStr.length()) を実行します。
はoutStrを返します。
}

public static void main(String[] args) throws IOException {.
文字列 string = "私のデータ"。
System.out.println("after compress:")を実行します。
文字列 compressed = compress(文字列);
System.out.println(compressed)を実行します。
System.out.println("after decompress:")を実行します。
文字列 decomp = decompress(compressed)。
System.out.println(decomp)を実行します。
}

解決策は以下のように判明しました。

String outStr = out.toString("UTF-8"); "out" は zip で圧縮されたバイトストリームで、String としてエンコードしてから String からデコードすると、いくつかのバイトが失われることになります。これを解決するには、compress() でバイトを String としてエンコードして、たとえば次のように返します。

<ブロッククオート

String infoBase64Encode = new String(Base64.encodeBase64(out.toByteArray()))

String() を伸長してバイトを返す、など。

文字列 infoBase64Decode = Base64.decodeBase64(decryptAESinfo)

コードの全文は以下の通りです。

public static String compress(String str) throws IOException {...
if (str == null || str.length() == 0) {.
strを返します。
}
System.out.println("String length : " + str.length())を実行します。
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out)。
gzip.write(str.getBytes())を実行。
gzip.close()を実行します。
String outStr = new String(Base64.encodeBase64(out.toByteArray()));
System.out.println("Output String lenght : " + outStr.length()) を実行します。
System.out.println("Output : " + outStr.toString())を実行します。
はoutStrを返します。
}

public static String decompress(String str) throws IOException {...
if (str == null || str.length() == 0) {...
strを返します。
}
System.out.println("Input String length : " + str.length())を実行します。
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(Base64.decodeBase64(str)));
文字列 outStr = ""。
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[256]です。
int n;
while ((n = gis.read(buffer))>=0){。
out.write(buffer, 0, n)を実行します。
}
System.out.println("Output String lenght : " + outStr.length()) を実行します。
return new String(out.toByteArray());
}

public static void main(String[] args) throws IOException {.
文字列 string = "私のデータ"。
System.out.println("after compress:")を実行します。
文字列 compressed = compress(文字列);
System.out.println(compressed)を実行します。
System.out.println("after decompress:")を実行します。
文字列 decomp = decompress(compressed)。
System.out.println(decomp)を実行します。
}