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

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

  // 压缩
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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值