使用GZIPOutputStream压缩字符串

4

我想要压缩我的字符串值,这些字符串的格式应该与.net压缩后的字符串相同。

我编写了一个解压缩方法,当我将一个.net压缩后的字符串传递给它时,它可以正常工作。但是压缩方法却无法正常工作。

public static String Decompress(String zipText) throws IOException {
    int size = 0;
    byte[] gzipBuff = Base64.decode(zipText);

    ByteArrayInputStream memstream = new ByteArrayInputStream(gzipBuff, 4,
            gzipBuff.length - 4);
    GZIPInputStream gzin = new GZIPInputStream(memstream);

    final int buffSize = 8192;
    byte[] tempBuffer = new byte[buffSize];
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((size = gzin.read(tempBuffer, 0, buffSize)) != -1) {
        baos.write(tempBuffer, 0, size);
    }
    byte[] buffer = baos.toByteArray();
    baos.close();

    return new String(buffer, "UTF-8");
}

public static String Compress(String text) throws IOException {
    byte[] gzipBuff = EncodingUtils.getBytes(text, "UTF-8");

    ByteArrayOutputStream bs = new ByteArrayOutputStream();
    GZIPOutputStream gzin = new GZIPOutputStream(bs);

    gzin.write(gzipBuff);
    gzin.finish();
    bs.close();

    byte[] buffer = bs.toByteArray();
    gzin.close();

    return Base64.encode(buffer);
}

例如,当我发送"BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/w+GphA2BQAAAA=="Decompress方法时,它返回字符串"Hello",但是当我发送"Hello"Compress方法时,它返回"H4sIAAAAAAAAAMtIzcnJBwCGphA2BQAAAA=="Compress方法中的问题是什么?
2个回答

3

请查看使用Zip流和Base64编码器压缩大字符串数据,了解如何使用GZIPOutputStream/GZIInputStream和Base64编码器和解码器来压缩和解压大的字符串数据,以便可以将其作为文本在HTTP响应中传递。

public static String compressString(String srcTxt) throws IOException {
  ByteArrayOutputStream rstBao = new ByteArrayOutputStream();
  GZIPOutputStream zos = new GZIPOutputStream(rstBao);
  zos.write(srcTxt.getBytes());
  IOUtils.closeQuietly(zos);

  byte[] bytes = rstBao.toByteArray();
  return Base64.encodeBase64String(bytes);
}

或者我们可以使用Zip流和Base64编码器来压缩大型字符串数据,以避免将整个字符串加载到内存中。

public static String uncompressString(String zippedBase64Str) throws IOException {
  String result = null;
  byte[] bytes = Base64.decodeBase64(zippedBase64Str);
  GZIPInputStream zi = null;
  try {
    zi = new GZIPInputStream(new ByteArrayInputStream(bytes));
    result = IOUtils.toString(zi);
  } finally {
    IOUtils.closeQuietly(zi);
  }
    return result;
}

请尝试阅读此链接http://stackoverflow.com/help/deleted-answers,以更好地了解如何“不”回答问题。即:“根本没有回答问题的答案”:**几乎只是一个指向外部网站的链接**。 - Radim Köhler

0

我已经尝试过使用Java虚拟机,我想结果应该是一样的。 在您的压缩方法末尾使用此行:

return new String(base64.encode(buffer), "UTF-8");

抱歉,在Android中构造函数String(String, String)未定义。 - Bobs
文档讲解了encodeToString()方法:Base64.html。我无法尝试它,因为我无法在我的电脑上安装Android。 - revo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接