2012-02-15 20 views
0

私持っている私たちは(明確にするため取り除かエラー処理と資源との)文字列を圧縮するために使用するコードを次のようにしようとしたときGZIP文字列圧縮は「£」文字解凍に失敗し

import java.util.zip.GZIP*; 
import java.io.*; 
import java.util.zip.GZIPOutputStream; 
import org.apache.commons.io.IOUtils; 
import com.Ostermiller.util.Base64; 

//Code to compress the string 
ByteArrayOutputStream output = new ByteArrayOutputStream(65536); 
BufferedWriter writer = new BufferedWriter(
      new OutputStreamWriter(new GZIPOutputStream(output))); 
writer.write(stringContents); 
String compressedString = new String(Base64.encode(output.toByteArray())); 

... 

//Code to decompress the string 
byte[] compressedData = Base64.decode(compressedString.getBytes()); 
BufferedInputStream reader = new BufferedInputStream(
      new GZIPInputStream(new ByteArrayInputStream(compressedData))); 
String uncompressedString = IOUtils.toString(reader, "UTF-8"); 

我々は、エラーが発生していますエンコードし、次に文字列を '£'でデコードします。具体的には、文字列はOK圧縮し、私たちは次のスタックトレースを取得した文字列を解凍しようとしたとき:

sun.io.MalformedInputException 
at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java(Compiled Code)) 
at sun.nio.cs.StreamDecoder$ConverterSD.convertInto(StreamDecoder.java:287) 
at sun.nio.cs.StreamDecoder$ConverterSD.implRead(StreamDecoder.java:337) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:223) 
at java.io.InputStreamReader.read(InputStreamReader.java:208) 
at java.io.Reader.read(Reader.java:113) 
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1128) 
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1104) 
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1078) 
at org.apache.commons.io.IOUtils.toString(IOUtils.java:382) 

は、誰もが私に私の方法のエラーを伝えることができると私はこの状況を解決する方法を?これを行うより良い方法はありますか?事前に多くの感謝。

答えて

5

あなたはデータを圧縮するときは、文字エンコーディングを指定する必要があります。

BufferedWriter writer = new BufferedWriter(
      new OutputStreamWriter(new GZIPOutputStream(output), "UTF-8")); 

をそうでない場合は、テキストはあなたのケースではない、システムのデフォルトの文字エンコーディングに従ってバイトに変換され、UTF- 8。

+2

素晴らしい!完璧に動作します。私の(今明らかな)間違いを指摘してくれてありがとう。 –

関連する問題