最近项目和其他项目信息交互,因数据量比较大造成效率比较低,我就研究了下数据压缩传输,以下为模拟代码,希望有用的人可以借鉴一下,我写的并非接口调用,为了节约代码,就把原理写了下来,希望你们可以看的明白,如果不明白,可以留言,代码如下:
package com.test.compress;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
import org.junit.Assert;
public final class CompressionUtil { ?
??
? ? private static final int BUFFER_SIZE = 4 * 1024; ?
??
? ? public static byte[] compress(byte[] data,Level level) throws IOException { ?
??
? ? ? ? Assert.assertNotNull(data); ?
? ? ? ? Assert.assertNotNull(level); ?
??
? ? ? ? Deflater deflater = new Deflater(); ?
? ? ? ? // set compression level ?
? ? ? ? deflater.setLevel(level.getLevel()); ?
? ? ? ? deflater.setInput(data); ?
??
? ? ? ? ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); ?
??
? ? ? ? deflater.finish(); ?
? ? ? ? byte[] buffer = new byte[BUFFER_SIZE]; ?
? ? ? ? while (!deflater.finished()) { ?
? ? ? ? ? ? int count = deflater.deflate(buffer); // returns the generated ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // code... index ?
? ? ? ? ? ? outputStream.write(buffer,count); ?
? ? ? ? } ?
? ? ? ? byte[] output = outputStream.toByteArray(); ?
? ? ? ? outputStream.close(); ?
? ? ? ? return output; ?
? ? } ?
??
? ? public static byte[] decompress(byte[] data) throws IOException,DataFormatException { ?
??
? ? ? ? Assert.assertNotNull(data); ?
??
? ? ? ? Inflater inflater = new Inflater(); ?
? ? ? ? inflater.setInput(data); ?
??
? ? ? ? ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); ?
? ? ? ? byte[] buffer = new byte[BUFFER_SIZE]; ?
? ? ? ? while (!inflater.finished()) { ?
? ? ? ? ? ? int count = inflater.inflate(buffer); ?
? ? ? ? ? ? outputStream.write(buffer,count); ?
? ? ? ? } ?
? ? ? ? byte[] output = outputStream.toByteArray(); ?
? ? ? ? outputStream.close(); ?
? ? ? ? return output; ?
? ? } ?
??
? ? /**?
? ? ?* Compression level?
? ? ?*/ ?
? ? public static enum Level { ?
??
? ? ? ? /**?
? ? ? ? ?* Compression level for no compression.?
? ? ? ? ?*/ ?
? ? ? ? NO_COMPRESSION(0),?
??
? ? ? ? /**?
? ? ? ? ?* Compression level for fastest compression.?
? ? ? ? ?*/ ?
? ? ? ? BEST_SPEED(1),?
??
? ? ? ? /**?
? ? ? ? ?* Compression level for best compression.?
? ? ? ? ?*/ ?
? ? ? ? BEST_COMPRESSION(9),?
??
? ? ? ? /**?
? ? ? ? ?* Default compression level.?
? ? ? ? ?*/ ?
? ? ? ? DEFAULT_COMPRESSION(-1); ?
??
? ? ? ? private int level; ?
??
? ? ? ? Level(int level) { ?
? ? ? ? ? ? this.level = level; ?
? ? ? ? } ?
? ? ? ? public int getLevel() { ?
? ? ? ? ? ? return level; ?
? ? ? ? } ?
? ? }?
}
package com.test.json;
import java.util.ArrayList; import java.util.List; import com.test.compress.CompressionUtil; import net.sf.json.JSONArray; import net.sf.json.JsonConfig; public class TestCompress { public static JSONArray ListToJSONArray(List<Student> list) { ? ? return JSONArray.fromObject(list); ? ? } @SuppressWarnings("unchecked") public static List<Student> JSONArrayToList(JSONArray jsonArray) { ? ? //参数1为要转换的JSONArray数据,参数2为要转换的目标数据,即List盛装的数据 ? ? return JSONArray.toList(jsonArray,new Student(),new JsonConfig()); ? ? } public static String toString(String[] strs) { ? ? String str = "["; ? ? for(String s : strs) { ? ? str += '"' + s + '"' + ','; ? ? } ? ? return str.substring(0,str.length()-1) + "]"; ? ?} public static void main(String[] args) throws Exception { /*---------------------------- 客户端代码 -----------------------------------*/ //创建JavaBean Student student = null; //创建测试用的List List<Student> list = new ArrayList<Student>(); for(int i = 0; i < 10000; i++) { student = new Student(); student.setId(i); student.setName("张" + i); student.setAge(i); student.setSex("男"); student.setHobby(new String[]{"篮球","上网","跑步","游戏"}); list.add(student); } //List 转 JSONArray JSONArray jsonArray = ListToJSONArray(list); //二进制压缩 byte[] output = CompressionUtil.compress(jsonArray.toString().getBytes(),CompressionUtil.Level.BEST_COMPRESSION); // 接口调用传输数据 参数为 output /*---------------------------- 服务端代码 -----------------------------------*/ // 接收output参数 为客户端传入数据 //二进制解压 byte[] jsonMessage = CompressionUtil.decompress(output); //String 转 JSONArray JSONArray jsonArray2 = JSONArray.fromObject(new String(jsonMessage)); //JSONArray 转 List List<Student> studentList = JSONArrayToList(jsonArray2);? //遍历信息 for(Student stu : studentList) { System.out.println("-----------------------------"); System.out.println("ID:" + stu.getId()); System.out.println("NAME:" + stu.getName()); System.out.println("SEX:" + stu.getSex()); System.out.println("AGE:" + stu.getAge()); System.out.println("HOBBY:" + toString(stu.getHobby())); } } }