对传输数据的压缩
上次写了关于客户端与服务端传输数据的加密,但对大量数据加密操作要花费大量的时间,所以对于大量数据最好进行压缩后再加密,同时我们平时传输的数据如果太多也可以压缩后再传输,我们对zip加密方法对数据加密,先写代码:
public class ZipUtils {
public static void main(String [] args){
String s = ""; //s中写出对应的字符串,下面我们对字符串的长度和格式进行分析
System.out.println(s.length());
String s1 = zip(s);
System.out.println(s1.length());
String s2 = unzip(s1);
System.out.println(s2.length());
}
/**
* 使用zip进行压缩
*
* @param str
* 压缩前的文本
* @return 返回压缩后的文本
*/
public static final String zip(String str) {
if (str == null)
return null;
byte[] compressed;
ByteArrayOutputStream out = null;
ZipOutputStream zout = null;
String compressedStr = null;
try {
out = new ByteArrayOutputStream();
zout = new ZipOutputStream(out);
zout.putNextEntry(new ZipEntry("0"));
zout.write(str.getBytes());
zout.closeEntry();
compressed = out.toByteArray();
compressedStr = new sun.misc.BASE64Encoder().encodeBuffer(compressed);
} catch (IOException e) {
compressed = null;
} finally {
if (zout != null) {
try {
zout.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
return compressedStr;
}
/**
* 使用zip进行解压缩
*
* @param compressedStr
* 压缩后的文本
* @return 解压后的字符串
*/
public static final String unzip(String compressedStr) {
if (compressedStr == null) {
return null;
}
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
ZipInputStream zin = null;
String decompressed = null;
try {
byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
out = new ByteArrayOutputStream();
in = new ByteArrayInputStream(compressed);
zin = new ZipInputStream(in);
zin.getNextEntry();
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = zin.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
decompressed = null;
} finally {
if (zin != null) {
try {
zin.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
return decompressed;
}
}
我们来分析一下压缩的效率
如果我们的字符串很短,我们压缩的字符串会比原来的大
String s = “{[{\”username\”:\”123\”,\”password\”:\”1234123\”},{\”username\”:\”wer\”,\”password\”:\”sdffssdsf\”},{\”username\”:\”dew\”,\”password\”:\”122332r3er\”}]}”;
我们的到的结果:
128
163
128
但是如果我们的数据很多结果就不一样了,我们构造一个字符串
public static void main(String [] args){
String s4 = "";
for(int i=0; i<100; i++){
s4 = s4 + "{\"username\":" + Math.random()*100 + ",\"password\":" + UUID.randomUUID() + "},";
}
s4 = s4.substring(0, s4.length()-1);
s4 = "{[" + s4 + "]}";
System.out.println(s4.length());
String s1 = zip(s4);
System.out.println(s1.length());
String s2 = unzip(s1);
System.out.println(s2.length());
}
结果:
7926
4770
7926
我们可以看到当我们的数据很多时我们的压缩方法可以很大程度的减小字符的长度,但当我们的信息量不大时,压缩算法所构建的映射表的长度占的比重很大,压缩的字符串就比原来的字符串的长度长,所以我们在使用压缩算法时一定要判断数据的长度,要不然就不一定能够减小我们要传输的信息量。