4

I want to zip my string values. These string values should be same as .net zipped strings.

I wrote Decompress method and when I send a .net zipped string to it, it works correctly. But the Compress method does not work correctly.

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);
}

For example when I send "BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/w+GphA2BQAAAA==" to Decompress method It returns the string "Hello", but when I send "Hello" to Compress method It returns "H4sIAAAAAAAAAMtIzcnJBwCGphA2BQAAAA==".

What is the problem in Compress method????

Bob
  • 22,810
  • 38
  • 143
  • 225

2 Answers2

3

Check Use Zip Stream and Base64 Encoder to Compress Large String Data

about how to use GZIPOutputStream/GZIInputStream and Base64 Encoder and Decoder to compress and uncompress large string data, so it can be passed as text in http response.

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);
}

Or we can use Use Zip Stream and Base64 Encoder to Compress Large String Data to avoid load whole string into memory.

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;
}
jeffery.yuan
  • 1,177
  • 1
  • 17
  • 27
JeffersonZhang
  • 229
  • 2
  • 5
  • Please, try to read this http://stackoverflow.com/help/deleted-answers, to get more understanding how to **not** answer. Namely: "Answers that do not fundamentally answer the question": **barely more than a link to an external site** – Radim Köhler Nov 13 '13 at 04:23
0

I have tried with java vm i suppose the result is the same. Use this line at the end of your Compress method :

return new String(base64.encode(buffer), "UTF-8");
revo
  • 540
  • 1
  • 5
  • 15
  • sorry in android The constructor String(String, String) is undefined – Bob Jul 19 '11 at 13:23
  • the documentation talk about encodeToString() method : [Base64.html](http://developer.android.com/reference/android/util/Base64.html#encode%28byte[],%20int%29). I cannot try it i cannot install android on my PC. – revo Jul 19 '11 at 13:31