Java压缩字符串

前言

需要再数据保存大长度的字段,导致查询的时候相当慢的。有些占用内存100多k,个人觉得即使拆表保存也是一样,查询会缓慢。我记得字段保存的数据要尽可能的短,所以考虑到压缩数据再保存

 

demo

public static void main(String[] args) throws IOException {
        // 字符串超过一定的长度
        StringBuilder sb = new StringBuilder();

        sb.append("


已经连续出了2天的眼妆妆教,完子生怕大家会看到腻。


但评论里的你们,依然在呼唤各种眼影盘、各类眼型的眼妆教程...



我掐指一算,哪怕连续更新一周也教不完啊!



授人鱼不如授人以渔,今天来教大家一个快速配色技能。


大家在考核一个眼影盘是否实用、该不该买的时候,需要先考虑这一点:


「 这盘色彩,能不能让你在脑海中,完成3组以上的配色方案,并且妆感风格各不相同?」


这时就轮到万能公式上场啦!任何眼影盘都通用喔,快拿出你的小本本记好▽


万 能 公 式 :

1. 「哑光浅色」用来铺在眼皮上打底


2. 「饱和度相对较高的颜色」可以用来加深眼窝轮廓,或眼皮褶皱


3. 「带细闪浅色或亮片色」可做眼皮中央的提亮


4. 「深色」可以用来加深上下眼尾,打造深邃的感觉


了解万能公式之后,还要清楚眼皮部位的具体位置,方便大家对应下文的配色方案~



这次,完子用很久没露面的12色眼影盘来做例子,教大家如何选配色!



 1. 日常通勤 · 配色  


STEP1

用TAIL大范围打底


STEP2

用OINK晕染在眼皮褶皱处


STEP3

用SLEEPY加深眼尾



"); sb.append("

  2. 假日微醺 · 配色  


STEP1

用INNOCENT大范围打底


STEP2

用BLOSSOM晕染眼褶处


STEP3

用PLUM加深眼尾



  3. 少女日常 · 配色  


STEP1

用PLGLET大范围打底眼皮


STEP2

用SCENT提亮眼皮中央


STEP3

用DEWY提亮卧蚕



  4. 撩人约会 · 配色  


STEP1

"); sb.append("用ROSEATE打底,并晕染在卧蚕位置


STEP2

用JOVIALITY提亮眼中


STEP3

用ROSY加深眼尾



  唇釉搭配推荐 · G03  


喜欢小猪盘的小仙女,都有一颗粉色少女心~搭配温柔知性的玫瑰色,超符合甜美的气质,选择百搭的g03一定不会出错哦~


感谢小仙女 @SUEVEN 来自小红书的分享图



  1. 落日余晖 · 配色  


STEP1

用ENCOUNTER打底


STEP2

用TERRITORY晕染眼褶处


STEP3

用ROAR加深眼尾



  2. 伪素颜 · 配色  


STEP1

用FUR打底


STEP2

用GAZE提亮眼皮中央


STEP3

用BELLY晕染卧蚕



  3. 夏日西柚 · 配色  


STEP1

用PADS打底


STEP2

用PREDATOR晕染眼褶处


STEP3

用ROAM提亮眼皮中央



  4. 橘子汽水 · 配色  


STEP1

用STRETCH打底


STEP2

用HUNTING提亮眼皮中央


STEP3

用STRIPED加深眼尾



  唇釉搭配推荐 · G06  


一年四季不过时的枫叶红g06,超搭这个同时拥有夏日元气色、秋冬暖棕调的斑虎盘,超级显白显气色,不允许你们还没有拥有它~





  1. 森系少女 · 配色  


STEP1

用SENSORY打底


STEP2

用MOSSY加深眼尾


STEP3

用ACUTE提亮眼皮中央



  2. 心机通勤 · 配色  

"); sb.append("

STEP1

用CRUISE打底


STEP2

用BOG加深眼尾


STEP3

用JAW提亮眼皮中央,

用ONDINE晕染卧蚕位置



  3. 复古港风 · 配色  


STEP1

用SENSORY打底


STEP2

用CAMOUFLAGE加深眼尾并晕染眼头,营造深邃感


STEP3

用DAZZLING提亮眼中



  4. 野生蹦迪 · 配色  


STEP1

用MOSSY打底


STEP2

用SUBMERGE加深眼尾


STEP3

用DAZZLING或ACUTE提亮眼中;DAZZLING晕染卧蚕



  唇釉搭配推荐 · G08  


如果担心“红配绿”的妆容会很突兀,不如选择偏橘调的g08吧,少女元气感满满的血橙色,黄皮宝宝也能驾驭哦。


感谢小仙女 @miss拔草小仙女 来自小红书的分享图




 1. 日常可hold · 配色 


STEP1

用DEFY大范围打底


STEP2

用STARING提亮眼皮中央,并晕染卧蚕处


STEP3

用OBSCURE加深眼尾



  2. 冷艳星河 · 配色  


STEP1

用ARROGANCE打底


STEP2

用FASCINATE晕染眼褶处


STEP3

用STARING提亮眼皮中央



  3. 冰雪可人 · 配色  


STEP1

用WANDER打底


STEP2

用ICY提亮眼头,并晕染在卧蚕位置


STEP3

用ARROGANCE加深眼尾



  4. 气场烟熏 · 配色  


STEP1

用DINAS打底


STEP2

用SCORN提亮眼中和卧蚕


STEP3

用NOCTURNAL加深眼尾并晕染眼头,营造深邃感



  唇釉搭配推荐 · G05  


能够配得上冰雪queen冷色调的口红,完子要推荐g05宝石红色无疑了。薄涂就是日常好气色,略带一些玫红调,厚涂更加气场十足~


感谢小仙女 @柒白雪 来自小红书的分享图



希望大家学会配色技能,以后可以举一反三,活学活用鸭~

 






大家还想看什么"); sb.append("产品的妆教呢?完子安排时间给大家出教程。呼声越高,安排时间越早哦,快到评论区告诉我吧~




"); String str=sb.toString(); System.out.println("\n原始的字符串为------->" + str); float len0=str.length(); System.out.println("原始的字符串长度为------->"+len0); long time=System.nanoTime(); String ys = compress(str); long time1=System.nanoTime(); System.out.println(time1-time); System.out.println("\n压缩后的字符串为----->" + ys); float len1=ys.length(); System.out.println("压缩后的字符串长度为----->" + len1); long time2=System.nanoTime(); String jy = unCompress(ys); long time3=System.nanoTime(); System.out.println(time3-time2); System.out.println("\n解压缩后的字符串为--->" + jy); System.out.println("解压缩后的字符串长度为--->"+jy.length()); System.out.println("\n压缩比例为"+len1/len0); //判断 if(str.equals(jy)){ System.out.println("先压缩再解压以后字符串和原来的是一模一样的"); } } /** * 字符串的压缩 * * @param str * 待压缩的字符串 * @return 返回压缩后的字符串 * @throws IOException */ public static String compress(String str) throws IOException { if (null == str || str.length() <= 0) { return str; } // 创建一个新的 byte 数组输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 使用默认缓冲区大小创建新的输出流 GZIPOutputStream gzip = new GZIPOutputStream(out); // 将 b.length 个字节写入此输出流 gzip.write(str.getBytes()); gzip.close(); // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串 return out.toString("ISO-8859-1"); } /** * 字符串的解压 * * @param str * 对字符串解压 * @return 返回解压缩后的字符串 * @throws IOException */ public static String unCompress(String str) throws IOException { if (null == str || str.length() <= 0) { return str; } // 创建一个新的 byte 数组输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组 ByteArrayInputStream in = new ByteArrayInputStream(str .getBytes("ISO-8859-1")); // 使用默认缓冲区大小创建新的输入流 GZIPInputStream gzip = new GZIPInputStream(in); byte[] buffer = new byte[256]; int n = 0; while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组 // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流 out.write(buffer, 0, n); } // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串 return out.toString("UTF-8"); }

可以看到String字符串也是相当的长的,使用的是GZIPOutputStream进行压缩还有解压。

 

输出结果


原始的字符串长度为------->153693.0
5677000

解压缩后的字符串长度为--->153693

压缩比例为0.057705946
先压缩再解压以后字符串和原来的是一模一样的

 

压缩时间 

0.005677 秒(s)

解压时间

0.0056905 秒(s)

 速度都是相对蛮快的。

 

对比

原本 :`content` longtext COMMENT '文章内容'

数据库字段

单纯根据id查询一条数据是0.4秒

 

压缩之后保存:压缩,解压都在0.0056秒左右,数据库查询一条在0.1秒多

 

总结

压缩存储比起直接储存会好很多

其实我们可以把这个字段拆出来,单独成表。速度也是可观的。

 

 

 

 

你可能感兴趣的:(Java压缩字符串)