JAVA中使用Zlib解压数据
1.问题背景
最近在生产环境中遇到一个问题,当物理设备采集的数据非常多时,通过JSON格式发给平台系统的时候,这个过程消耗非常多的时间。而且对下层物理设备的流量消耗非常大(据估算,一天7个G)。于是就考虑,将数据压缩之后再传给平台系统。而平台系统只需要将原本解析JSON的步骤前,加上解压操作就可以。这样不仅可以节省传输而且可以给下层物理设备节约很多流量。(经过压缩后的数据量比原来小了近20倍)
2.技术选择
在Hutool的文档上看到了一个压缩方法,可以压缩字符串、文件,解压文件。
3.编码
说明:由于下层物理设备是将数据先压缩之后,再用base64编码发给我的。所以,作为一名爪洼开发,我需要先使用base64解码,然后再对数据进行解压。以下代码中涉及到的工具类来自Hutool。
定义的压缩后的JSON格式如下:
"compressData":""
/**
*
* @param compressData 需要解压的数据对象
* @param <T> 解压后的数据对象
* @return
*/
<T> T deCompressData(T compressData) ;
@Override
public <T> T deCompressData(T obj) {
// 反射获取compressData属性的值
Object compressData = ReflectUtil.getFieldValue(obj, "compressData");
// 判断有压缩数据
if(ObjectUtil.isNotNull(compressData) && ObjectUtil.length(compressData)>0){
log.info("开始解码");
// 对象转成字节数组
byte[] bytes = JsonUtils.toJsonByte(compressData);
// base64解码
byte[] decode = Base64.decode(bytes);
// zlib 解压数据
byte[] resultBytes = ZipUtil.unZlib(decode);
return (T) JsonUtils.parseObject(resultBytes, obj.getClass());
}else{
return obj;
}
}
4.说明
上面定义了一个泛型方法,因为很多MQTT消息主题中的数据都需要压缩,考虑方法的可重用性,选择了这种方式。 有些数据没有经过压缩,所以我在方法里面先进行了判断是否有压缩字段。如果没有压缩字段的话,就把参数传入 的原数据对象返回。按照原来的流程进行处理,代码改动不大。