一、背景
小王瞥了一眼历史记录表,不禁惊呼:“这表怎么这么大?”同事们闻声纷纷围拢过来查看。仔细一瞧,发现这个表的大小竟然超过了3G。主管随即指示小王打开相应的表数据检查,发现其中存储了用户的权限信息,这些权限数据被转换成了JSON字符串并直接入库。众人面面相觑,小王更是感到困惑,问道:“这该如何是好?”
大林子思索片刻,建议道:“或许我们可以尝试对JSON进行压缩。”小王疑惑地问:“那能减少多少空间呢?”大林子估算道:“应该能够降低三分之二左右。”小王半信半疑,毕竟都是字符串,他觉得差别不会如此之大。为了证明自己的观点,大林子立刻编写了一个示例,并展示了一番压缩效果,让在场的所有人都感到惊讶。
二、大林子的例子
public static void main(String[] args) throws IOException {
// 原始的JSON字符串 内部数据不能展示,可以替换自己的JSON字符串,越大越明显
String jsonString = "[{\"id\": \"11111\"}]";
byte[] compressedData1 = jsonString.getBytes();
System.out.println("Pre-compressed data Length: "+compressedData1.length);
// 将JSON对象转换为字符串
System.out.println("Original JSON String: "+jsonString);
// 压缩JSON字符串
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
gzipOutputStream.write(jsonString.getBytes("UTF-8"));
gzipOutputStream.close();
byte[] compressedData = byteArrayOutputStream.toByteArray();
System.out.println("Compressed Data Length: "+compressedData.length);
// 解压缩数据并还原为JSON字符串
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(compressedData);
GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);
ByteArrayOutputStream decompressedOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = gzipInputStream.read(buffer)) != -1) {
decompressedOutputStream.write(buffer, 0, len);
}
gzipInputStream.close();
String decompressedJsonString = decompressedOutputStream.toString("UTF-8");
System.out.println("Decompressed JSON String: " + decompressedJsonString);
}