package com.cf.imes.module.executor.util;

import org.apache.commons.codec.binary.Base64;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class CompressTest {

    /**
     * 压缩
     *
     * @param str 要压缩的字符串
     * @return 压缩后的字符串
     */
    public static String compress(String str) throws Exception{
        Deflater deflater = new Deflater(9); // 0 ~ 9 压缩等级 低到高 推荐9
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256)){
            deflater.setInput(str.getBytes());
            deflater.finish();
            final byte[] bytes = new byte[256];
            while (!deflater.finished()) {
                int length = deflater.deflate(bytes);
                outputStream.write(bytes, 0, length);
            }
            return new String( java.util.Base64.getEncoder().encode(outputStream.toByteArray()));
           // return new sun.misc.BASE64Encoder().encodeBuffer(outputStream.toByteArray());
        } finally {
            deflater.end();
        }
    }

    /**
     *
     * @param encodeStr 待解压缩的字符串
     * @return 解压缩后的字节数组
     * @throws IOException
     */
    public static String uncompress(String encodeStr) throws IOException {
        int len = 0;
        Inflater infl = new Inflater();
        infl.setInput(Base64.decodeBase64(encodeStr));
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] outByte = new byte[1024];
        try {
            while (!infl.finished()) {
                // 解压缩并将解压缩后的内容输出到字节输出流bos中
                len = infl.inflate(outByte);
                if (len == 0) {
                    break;
                }
                bos.write(outByte, 0, len);
            }
            infl.end();
        } catch (Exception e) {
            //
            e.printStackTrace();
        } finally {
            bos.close();
        }
        return bos.toString();
    }
    public static void main(String[] args)throws Exception{
        StringBuilder sb = new StringBuilder();
        sb.append("{\"test\":\"111\"}");
        String str = sb.toString();
        String eos = compress(str);
        System.out.println(eos);
        String deos = uncompress(eos);
        System.out.println(deos);
    }
}

