Java gzip 压缩和解压缩

package src;

import java.io.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * GZIP工具类
 *
 * @author [email protected]
 * @date 2019/7/19 下午7:03
 */
public final class GZIPUtil {
    public static final String GZIP_ENCODE_UTF_8 = "UTF-8";

    /**
     * 字符串压缩为UTF-8编码的GZIP字节数组
     *
     * @param str 字符串
     * @return 字节数组
     */
    public static byte[] compress(String str) {
        return compress(str, GZIP_ENCODE_UTF_8);
    }

    /**
     * 字符串压缩为GZIP字节数组
     *
     * @param str      字符串
     * @param encoding 编码格式
     * @return 字节数组
     */
    public static byte[] compress(String str, String encoding) {
        if (str == null || str.length() == 0) {
            return null;
        }

        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            compress(str.getBytes(encoding), out);
            return out.toByteArray();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;

    }

    /**
     * 数据压缩到输出流
     *
     * @param data 字节数组
     * @param out  输出流
     * @param   extends OutputStream
     */
    public static <T extends OutputStream> void compress(byte[] data, T out) {
        GZIPOutputStream gos = null;
        try {
            gos = new GZIPOutputStream(out);
            gos.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                gos.close();
            } catch (IOException e) {
            }
        }
    }


    /**
     * GZIP解压字节数组
     *
     * @param bytes GZIP压缩的字节数组
     * @return GZIP解压后的字节数组
     */
    public static byte[] uncompress(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        uncompress(new ByteArrayInputStream(bytes), out);
        if (null != out) {
            return out.toByteArray();
        }

        return null;
    }


    /**
     * GZIP解压UTF-8编码的字节数组
     *
     * @param bytes GZIP压缩的字节数组
     * @return GZIP解压后的字符串
     */
    public static String uncompressToString(byte[] bytes) {
        return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
    }

    /**
     * GZIP解压字节数组
     *
     * @param bytes    GZIP压缩的字节数组
     * @param encoding 编码格式
     * @return GZIP解压后的字符串
     */
    public static String uncompressToString(byte[] bytes, String encoding) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        uncompress(new ByteArrayInputStream(bytes), out);
        if (null != out) {
            try {
                return out.toString(encoding);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        return null;
    }


    /**
     * GIZP解压缩输入流数据到输出流
     *
     * @param in  InputStream
     * @param out OutputStream
     * @param  extends InputStream
     * @param  extends OutputStream
     */
    public static <T extends InputStream, E extends OutputStream> void uncompress(T in, E out) {
        GZIPInputStream ungzip = null;
        try {
            ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != ungzip) {
                try {
                    ungzip.close();
                } catch (IOException e) {
                }
            }
        }
    }

    public static void main(String[] args) {
        String str = "%5-1sdf22322222sedssf测试sdklasdkgnfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff!@#$%^&****()_+=";
        System.out.println("压缩前字符串长度:" + str.length());
        System.out.println("压缩后字符串长度:" + new String(compress(str)).length());
        System.out.println("压缩前字符串:" + str);
        System.out.println("压缩后字符串:");
        System.out.println(new String(compress(str)));
        System.out.println("解压缩后字符串:" + new String(uncompress(compress(str))));
        System.out.println("解压缩后字符串:" + uncompressToString(compress(str)));
    }
}

运行结果:
Java gzip 压缩和解压缩_第1张图片
网页测试:

@RestController
@RequestMapping("/api/gzip")
public class GzipController {
    @GetMapping("/compress")
    public void gzipData(HttpServletRequest request, HttpServletResponse response) {
        // 告诉浏览器数据使用gzip进行压缩,浏览器会自动解压。 
        response.setHeader("Content-Encoding", "gzip");
        String info = "gzip测试";
        try {
            GZIPUtil.compress(info.getBytes(), response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 }

测试结果:
Java gzip 压缩和解压缩_第2张图片

你可能感兴趣的:(Java基础)