自己实现RMI(六)压缩与解压

来源:互联网 发布:淘宝拍卖手表骗局揭秘 编辑:程序博客网 时间:2024/04/25 06:38

        当时在优化网络通信的时候,考虑到把序列化后的字符串压缩一下,体积减小,这样可能网络传输会快点。但是这个压缩过程比较耗时,而压缩解压带来的额外开销,和网络上直接传输体积稍微大的字符串,相比下来没什么优势(实际测试过了)。不过既然实践过了,还是留下一点痕迹吧。

  // 压缩public static byte[] compress(String str) throws IOException {    if (str == null || str.length() == 0) {      return new byte[0];    }        /* gzip压缩    ByteArrayOutputStream out = new ByteArrayOutputStream();    GZIPOutputStream gzip = new GZIPOutputStream(out);    gzip.write(str.getBytes("UTF-8"));    gzip.close();        return out.toByteArray();*/      byte[] output = new byte[0];          Deflater compresser = new Deflater();      byte[] data=str.getBytes();    compresser.reset();      compresser.setInput(data);      compresser.finish();      ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);      try {          byte[] buf = new byte[1024];          while (!compresser.finished()) {              int i = compresser.deflate(buf);              bos.write(buf, 0, i);              }              output = bos.toByteArray();      } catch (Exception e) {          output = data;          e.printStackTrace();      } finally {         try {                bos.close();             } catch (IOException e) {                e.printStackTrace();            }     }      compresser.end();      return output;  }  // 解压缩public static String uncompress(byte[] data,int len) throws IOException {    if (data == null || data.length == 0) {      return null;    }       /*    ByteArrayOutputStream out = new ByteArrayOutputStream();    ByteArrayInputStream in = new ByteArrayInputStream(data,0,len);    GZIPInputStream gunzip = new GZIPInputStream(in);    byte[] buffer = new byte[256];    int n;    while ((n = gunzip.read(buffer)) >= 0) {      out.write(buffer, 0, n);    }    // toString()使用平台默认编码,也可以显式的指定如toString("GBK")           return out.toString("UTF-8");*/      byte[] output = new byte[0];          Inflater decompresser = new Inflater();      decompresser.reset();      decompresser.setInput(data,0,len);        ByteArrayOutputStream o = new ByteArrayOutputStream(len);      try {          byte[] buf = new byte[1024];          while (!decompresser.finished()) {              int i = decompresser.inflate(buf);              o.write(buf, 0, i);             }             output = o.toByteArray();          }catch (Exception e) {              output = data;              e.printStackTrace();          } finally {              try {                  o.close();              } catch (IOException e) {                  e.printStackTrace();              }          }            decompresser.end();          return o.toString();  }  public static String mCompress(String src) throws IOException{if(src.length() <config.zipSize)return "--"+src;//添加压缩标志  byte[] out=compress(src);int i;String retString="++";//压缩标志for(i=0;i<out.length;i++){String hex = Integer.toHexString(out[i] & 0xFF);if (hex.length() == 1) { hex = '0' + hex; } retString +=hex.toUpperCase();}return retString;}  /*** 压缩和解压的效率还是有点低* @param hexString* @return* @throws IOException*/public static String mUnCompress(String hexString)throws IOException{if(hexString.startsWith("--"))    return hexString.substring(2);else if(hexString.startsWith("++"))    hexString=hexString.substring(2);else {    Log.log("compress error!");            return "";}hexString = hexString.toUpperCase();    int length = hexString.length() / 2;    char[] hexChars = hexString.toCharArray();    byte[] d = new byte[length];    for (int i = 0; i < length; i++) {        int pos = i * 2;        d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));    }            return uncompress(d, d.length);}