1、场景:由于数据库字段长度有限,并且不能随意的修改数据库字段的配置,数据库的某个字段设置的长度可能在设置初期是满足需求的,后期由于业务变更或业务量增大导致该字段存储的数据增长,落库时可能因为该字段数据长度过长导致落库失败,基于这种场景我们就有必要进行字符串的压缩,然后再进行落库,而落库后取出数据使用时再进行解压即可。

2、CompressUtil类:使用Java8中的gzip来进行实现

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;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;/*** 压缩String的工具类*/
@Slf4j
public class CompressUtil {/*** 使用gzip压缩字符串* @param str 要压缩的字符串* @return 压缩后的字符串*/public static String compress(String str) {if (str == null || str.length() <= 0) {return str;}ByteArrayOutputStream out = new ByteArrayOutputStream();try (GZIPOutputStream gzip = new GZIPOutputStream(out)) {gzip.write(str.getBytes(StandardCharsets.UTF_8));} catch (IOException e) {log.error("字符串压缩失败str:{},错误信息:{}", str, e.getMessage());throw new RuntimeException("字符串压缩失败");}return Base64.encodeBase64String(out.toByteArray());}/*** 使用gzip解压缩* @param compressedStr 压缩字符串* @return 解压后的字符串*/public static String uncompress(String compressedStr) {if (compressedStr == null || compressedStr.length() <= 0) {return compressedStr;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in;GZIPInputStream gzip = null;byte[] compressed;String decompressed;try {compressed = Base64.decodeBase64(compressedStr);in = new ByteArrayInputStream(compressed);gzip = new GZIPInputStream(in);byte[] buffer = new byte[1024];int offset;while ((offset = gzip.read(buffer)) != -1) {out.write(buffer, 0, offset);}decompressed = out.toString(StandardCharsets.UTF_8.name());} catch (IOException e) {log.error("字符串解压失败compressedStr:{},错误信息:{}", compressedStr, e.getMessage());throw new RuntimeException("字符串解压失败");} finally {if (gzip != null) {try {gzip.close();} catch (IOException ignored) {}}try {out.close();} catch (IOException ignored) {}}return decompressed;}
}

3、注意点:

1)CompressUtil在压缩过程和解压过程使用统一字符集,防止压缩和解压过程因为字符集不同导致结果与实际预期不符;

2)在web项目中,服务器端将加密后的字符串返回给前端,前端再通过ajax请求将加密字符串发送给服务器端处理的时候,在http传输过程中会改变加密字符串的内容,导致服务器解压压缩字符串发生异常;

而CompressUtil压缩和解压过程中使用Base64.encodeBase64String和Base64.decodeBase64进行编码和解码,可以完全解决上述问题。

3)压缩/解压失败怎么处理?
通过CompressUtil工具类可以看出,如果压缩或解压失败,过程发生异常,则会抛出一个运行时异常给调用方,方便调用方及时感知并处理;

具体如何处理要看具体的业务场景,我这边是在MQ消费者中调用,在MQ中统一捕获异常,所以如果压缩失败会进行重试,如果重试多次依然失败,我这边会进行报警打印日志,内部人会去处理。

4、单元测试:

import org.junit.Test;public class CompressUtilTest {@Testpublic void test1() {StringBuilder stringBuilder = new StringBuilder();for(int i = 0;i < 100000;i++) {stringBuilder.append("1");}System.out.println(stringBuilder.toString().length());String compress = CompressUtil.compress(stringBuilder.toString());System.out.println("compress="+compress);System.out.println(compress.length());String uncompress = CompressUtil.uncompress(compress);System.out.println(uncompress.length());System.out.println("uncompress=" + uncompress);}
}

测试1:100000压缩以后为180,解压后也可以正常返回原字符串

测试2:把压缩字符串长度改为1000再试一次,压缩后长度为40

压缩比例还是很高的,亲测可用!!!

Java 字符串压缩/解压【开发记录】相关推荐

  1. Java 字符串 压缩 解压

    实现字符串的压缩和解压功能 需要导入的jar import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; im ...

  2. 实现Java代码压缩解压

    原因:某个时间想对服务器上的zip中的某些文件进行修改 本来以为很简单的事情,在网上找了好些代码,结果效果都不是很理想. 实现对象:对各种类型的文件夹(包含子文件或子文件夹) 下面介绍一下自己综合网上 ...

  3. java 文件压缩 解压_Java文件压缩与解压缩(一)

    package com.cn; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream ...

  4. java gzip 压缩解压工具类

    因为觉得简单,本想抱着百度直接拿过来用的心态,结果发现网上的代码都转载自同一份,且埋了一个坑,你不仔细去梳理,很难发现. mark下需要注意的两点: 1. 编码/解码,压缩/解压缩是成对出现的 编码: ...

  5. java zip压缩解压_JAVA实现实用的ZIP压缩与解压

    程序实现了ZIP压缩.共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压. ...

  6. java如何压缩解压图片_Java实现压缩文件与解压缩文件

    由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包:但是Java自带的工具包存在问题:如果压缩或 ...

  7. php案例:字符串压缩解压

    作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 cyg.php cyg.php <?php $test_string="13545a ...

  8. 字符串GZIP压缩解压

    c# /// <summary>/// 字符串压缩解压/// </summary>public class Zipper{public static string Compre ...

  9. linux下gz和tar.gz、zip压缩解压

    文章目录 说明 分享 tar.gz 常用命令 gz 常用命令 zip 常用命令 总结 说明 本博客每周五更新一次. 日常数据处理中,经常需要压缩数据文件,减小传输带宽,方便分享和存储,整理gz.tar ...

最新文章

  1. C++ .h(头文件) 与 .cpp(源文件) 的使用
  2. python的垃圾处理机制_Python语法入门之垃圾回收机制
  3. Ubuntu Linux服务器安装HBase
  4. python实现语义分割_如何用PyTorch进行语义分割?一文搞定
  5. linux 防ddos攻击软件,linux系统下免费防DDOS CC攻击脚本,有效减轻服务器压力 【转】...
  6. setInterval()与clearInterval()的用法
  7. Kubernetes 小白学习笔记(23)--kubernetes的运维-管理Pod
  8. php读取mysql单条数据_用PHP框架与原始代码读取Mysql单条数据性能比较
  9. anaconda怎么打开python文件_anaconda 运行.py文件
  10. volte的sip信令流程_VOLTE-SIP完整信令解析
  11. 华硕双屏笔记本windows系统驱动安装
  12. bp神经网络预测python人口预测_BP神经网络人口预测程序(matlab实现)
  13. 【Qt】QWidget类详解(属性篇)
  14. 机器学习实战-预测数值型数据:回归
  15. Python将word表格存入excel —— 格式化pg参数手册
  16. 基于linux的oracle_rac实时应用集群研究,基于Linux的OracleRAC实时应用集群研究毕业设计论文(资料4)...
  17. 最强Python编程神器,真香!
  18. 人工智能(mysql)—— mysql事务、存储引擎及调优
  19. 《纽约时报》发文评选掀起区块链革命的10位代表性人物,吴忌寒上榜
  20. 在小程序里如何让用户快速选择到所在的小区

热门文章

  1. vue wangeditor配置
  2. < Power BI Desktop >之书签/页导航妙用
  3. 入门Web前端开发 <header>
  4. slot属性值_Vue入门之slot属性
  5. 【表面缺陷检测】基于yolov7的钢板表面缺陷检测(附代码)
  6. 1583_AURIX_TC275_SMU的控制以及FSP
  7. 怎么进入Docker 容器查看容器内文件,并复制容器内文件至本机
  8. 初识 PS CS6(十)___用操控变形修改图像
  9. mysql怎么修改表的列名字_怎么修改mysql的表名和列名?
  10. 【3D视觉创新应用竞赛作品系列​】多楼层室内环境下的三维几何重建