介绍
日常开发中,JSON经常会被用到。便于阅读的JSON格式肯定是格式化过后,携带大量换行、空格等等无效字符的样式。但这样的格式在一些流量敏感、耗时敏感的业务中需要压缩。
本文介绍如何使用java自带的Gzip压缩算法,压缩JSON字符串。
代码
直接上代码:
package com.szslxn.ems.device.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* @author longge93
*/
public class JsonCompressor {
public static byte[] compress(String json) throws IOException {
byte[] input = json.getBytes(StandardCharsets.UTF_8);
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream) {{
// 设置压缩比
// def.setLevel(Deflater.BEST_COMPRESSION);
// }}
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)
) {
gzipOutputStream.write(input);
gzipOutputStream.finish();
return outputStream.toByteArray();
}
}
public static String decompress(byte[] compressed) throws IOException {
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(compressed);
GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int length;
while ((length = gzipInputStream.read(buffer, 0, buffer.length)) != -1) {
outputStream.write(buffer, 0, length);
}
return outputStream.toString(StandardCharsets.UTF_8);
}
}
}
代码介绍:
- 合理的使用
try with resources
关闭了各种输入输出流。网上很多其他版本的,输入输出流没有正确关闭,长时间运行会出错。 - 代码中备注的部分,是可以设置Gzip的压缩级别的,通过调节这个设置,可以在压缩速度和压缩率之间,根据自己的业务需求寻求最佳配置。
- 实测压缩JSON的效果很不错,可以减少50%-75%的体积。