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算法等。

经验分享 程序员 微信小程序 职场和发展