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最新!
