2012-02-15 2 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"); 

우리는 오류가 발생한 인코딩 한 다음 문자열을 '£'기호로 디코딩합니다. 특히, 문자열 확인을 압축,하지만 우리는 다음과 같은 스택 추적을 얻을 문자열을 압축 할 때 :

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

최고! 완벽하게 작동합니다. 내 (지금 명백한) 실수를 지적 해 주셔서 감사합니다. –