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