最近项目和其他项目信息交互,因数据量比较大造成效率比较低,我就研究了下数据压缩传输,以下为模拟代码,希望有用的人可以借鉴一下,我写的并非接口调用,为了节约代码,就把原理写了下来,希望你们可以看的明白,如果不明白,可以留言,代码如下:
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())); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。