GZIPInputStream和Characterset

时间:2011-08-15 14:25:05

标签: java compression gzipinputstream

我有一个包含拉丁文,西里尔文和中文字符的文本。 我尝试使用bytes[]压缩字符串(超过GZIPOutputStream)并使用GZIPInputStream解压缩它。但我没有设法将所有字符转换回原始字符。有些显示为?

我认为UTF-16可以胜任。

任何帮助?

此致

这是我的代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.Inflater;
import java.util.zip.ZipException;

public class CompressUncompressStrings {

    public static void main(String[] args) throws UnsupportedEncodingException {

        String sTestString="äöüäöü 长安";
        System.out.println(sTestString);
        byte bcompressed[]=compress(sTestString.getBytes("UTF-16"));
        //byte bcompressed[]=compress(sTestString.getBytes());
        String sDecompressed=decompress(bcompressed);
        System.out.println(sDecompressed);
    }
    public static byte[] compress(byte[] content){
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try{
            GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
            gzipOutputStream.write(content);
            gzipOutputStream.close();
        } catch(IOException e){
            throw new RuntimeException(e);
        }
        return byteArrayOutputStream.toByteArray();
    }
    public static String decompress(byte[] contentBytes){

        String sReturn="";
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try{
            GZIPInputStream gzipInputStream =new GZIPInputStream(new ByteArrayInputStream(contentBytes));
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             for (int value = 0; value != -1;) {
                 value = gzipInputStream.read();
                 if (value != -1) {
                     baos.write(value);
                 }
             }
             gzipInputStream.close();
             baos.close();
             sReturn=new String(baos.toByteArray(), "UTF-16");
             return sReturn;
                 // Ende Neu

        } catch(IOException e){
            throw new RuntimeException(e);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我怀疑这只是控制台出了问题。我尝试了上面的代码,虽然它没有正确地打印出任何字符,但当我测试字符串的往返时,它很好:

System.out.println(sDecompressed.equals(sTestString)); // Prints true

你的机器有什么作用?

答案 1 :(得分:1)

在控制台输出上显示非ASCII字符并不容易。假设您使用Windows作为操作系统(因为默认情况下命令行不支持Unicode),您可以更改活动代码页编号(使用chcp命令)。我不知道它是如何通过代码完成的,但我建议在命令行上运行代码。

此chcp值65001更改为告诉窗口在其控制台上使用UTF-8(您可以查看讨论here)。

我希望这会有所帮助。