Java 文本数据的gzip压缩
一、gzip
Java提供的压缩方式有GZIP、Deflate和ZIP三种,其中GZIP带有CRC校验码、标识首部和尾部,数据部分和Deflate一致,相对来说具有较高的压缩比和压缩速度且带有校验方式,但java的GZIPOutputStream不提供压缩级别的设置,因此,改变压缩级别需要以继承等方式设置Deflate的压缩级别来实现。
二、代码示例
package com.company.example; import org.apache.commons.lang3.StringUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class Utills { /** * 文本数据gzip压缩 */ public static String gzipCompress(String text) { if (StringUtils.isEmpty(text)) { return null; } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) { gzipOutputStream.write(text.getBytes(StandardCharsets.UTF_8)); gzipOutputStream.flush(); gzipOutputStream.finish(); } catch (Exception e) { System.out.println(e); return null; } return Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray()); } /** * 文本数据gzip解压 */ public static String gzipDecompress(String text) { if (StringUtils.isEmpty(text)) { return null; } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(Base64.getDecoder().decode(text)); try (GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream)){ byte[] buffer = new byte[256]; int len; while ((len = gzipInputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, len); } }catch (Exception e){ System.out.println(e); return null; } return byteArrayOutputStream.toString(); } }
三、总结
对于数据包大小要求不是太高,服务端因各种历史因素未开启HTTP的压缩的,希望节省带宽提高数据传输效率的需求可以使用数据gzip压缩;编程环境安全性要求宽松的,可以考虑引入第三方的压缩算法,如谷歌的Brotli算法,或者facebook的zstd算法等。
下一篇:
C语言项目源代码大全2021最新!