package src;
import java.io.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* GZIP工具类
*
* @author xie.pengcheng@immomo.com
* @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 <T> 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 <T> extends InputStream
* @param <E> 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)));
}
}
运行结果:
网页测试:
@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();
}
}
}
测试结果: