public static byte[] compress(String str, String encoding) {
if (str == null || str.length() == 0) {
return null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip;
try {
gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes(encoding));
gzip.close();
} catch (IOException e) {
ApiLogger.error("gzip compress error.", e);
return out.toByteArray();
public static byte[] uncompress(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
try {
GZIPInputStream 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) {
ApiLogger.error("gzip uncompress error.", e);
return out.toByteArray();
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.StringUtils;
import cn.sina.api.commons.util.ApiLogger;
* @author wenqi5
public class GZIPUtils {
public static final String GZIP_ENCODE_UTF_8 = "UTF-8";
public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";
* 字符串压缩为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;
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip;
try {
gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes(encoding));
gzip.close();
} catch (IOException e) {
ApiLogger.error("gzip compress error.", e);
return out.toByteArray();
* GZIP解压缩
* @param bytes
* @return
public static byte[] uncompress(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
try {
GZIPInputStream 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) {
ApiLogger.error("gzip uncompress error.", e);
return out.toByteArray();
* @param bytes
* @return
public static String uncompressToString(byte[] bytes) {
return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
* @param bytes
* @param encoding
* @return
public static String uncompressToString(byte[] bytes, String encoding) {
if (bytes == null || bytes.length == 0) {
return null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
try {
GZIPInputStream ungzip = new GZIPInputStream(in);
byte[] buffer = new byte[256];
int n;
while ((n = ungzip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
return out.toString(encoding);
} catch (IOException e) {
ApiLogger.error("gzip uncompress to string error.", e);
return null;
public static void main(String[] args) {
String str =
"%5B%7B%22lastUpdateTime%22%3A%222011-10-28+9%3A39%3A41%22%2C%22smsList%22%3A%5B%7B%22liveState%22%3A%221";
System.out.println("原长度:" + str.length());
System.out.println("压缩后字符串:" + GZIPUtils.compress(str).toString().length());
System.out.println("解压缩后字符串:" + StringUtils.newStringUtf8(GZIPUtils.uncompress(GZIPUtils.compress(str))));
System.out.println("解压缩后字符串:" + GZIPUtils.uncompressToString(GZIPUtils.compress(str)));
一次偶然的项目开发中,因为数据量大,为了有效利用缓存空间来缓存数据。采用将源数据压缩的方式来缓存,于是乎,我便开始使用java中的gzip流,由于史无前例,所以我也开始了面向百度编程。但是我并没有老老实实的按照百度的做法来使用,我使用了jdk7提供的新特性(稍后演示给你看),也就是这个新特新把我坑惨了,话不多说,直接上案例!!!
下面是我使用gzip的代码(采用新特性,自认为没问题):
public class GzipUtil {
private static final
GZIPInputStream 类位于 java.util.zip 包下,继承于 InflaterInputStream 类,它实现了一个流式过滤器,主要用于读取GZIP文件格式的压缩数据
在上述代码中,我们首先创建一个 ByteArrayInputStream 对象,将传入的压缩数据作为输入流,并创建一个 GZIPInputStream 对象来解压缩数据。在上述代码中,我们首先创建一个 ByteArrayOutputStream 对象,然后使用 GZIPOutputStream 对象将 JSON 字符串写入 ByteArrayOutputStream 中,并关闭 GZIPOutputStream。通过以上代码,你可以实现将传输的 JSON 字符串进行压缩和解压缩。
zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。
Java I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。
相关类与接口:
Checksum 接口:被类Adler32和CRC32实现的接口
Adler32 :使用Alder32算法来计算Checksum数目
CRC32 :使用CRC32算法来计算Checksum数目
CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性
CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性
DeflaterOutputStream :压缩类的基类。
ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。
GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格
作为信息时代象征的Internet的广泛使用是毋庸置疑的,作为Internet的终极用户,您可能经常有这种抱怨,我的机器够快的,但使用Internet时总觉得慢,作为ISP又抱怨用户不愿意掏钱买更好的线路,作为ICP又觉得没有太好的软件可以让数据的流量变小,这种受带宽限制的Internet着实让很多人伤心,何不制作一个数据压缩程序,将数据压缩一下,让他变得快些呢,Web Server和IE提供了部分这样的功能,也就是将网页的内容进行压缩,但这仅仅是部分功能。
对于象地理信息系统,图书查询系统,ERP系统等的,Internet要传输的数据量相当大,而象图形数据、XML数据、文本数据其压缩率是相当高的,甚至可以压缩到百分之几,正是由于这个要求,我制作了这么两个软件:一是传输流/文件的压缩软件,另一个是基于HTTP的压缩传输软件,这两个软件花费了我很多心血(尽管里面还有一些BUG),但我准备把他作为免费软件,来庆贺我的生日,如果你想使用或想得到源码请发邮件给我。
第一个软件,传输流/文件的压缩,利用Internet中惯常使用的gzip, deflate算法,可以和sun java的GZipInputStream和GZipOutputStream互操作
第二个软件,基于HTTP的压缩传输软件,可完全和IE的VBScript和JScript无缝融合
更详细信息请看使用文档Help.doc
例子文件包含这么几个:
readme.doc 本文件
help.doc 帮助文档
GZCore.dll gzip,deflate压缩/解压程序,使用前必须注册
GZUtil.dll GZCore.dll的缓冲区处理封装,用于Web的流处理,使用前必须注册
GZip4Web.dll 基于Web的压缩文件/流的传送,使用前必须注册
Test.zip 第一个产品的例子, C++代码工程
Temp.asp 第一个产品的例子, 直接用压缩程序发送GZip流
SvrRecv.asp 第二个产品的例子,用于服务端处理接受的压缩流
SvrSend.asp 第二个产品的例子,用于服务端处理发送的压缩流
default.asp 第二个产品的例子,用于客户端处理处理接受文件,GZip流
如果您有好的建议或BUG汇报,请邮件给我,我先表示感谢。
重要说明,此软件不允许使用于商业用途,否则会受到牵连。
另注,由于本软件使用带来的任何损失,软件制作者概不负责。
Ashley Wang
ashleywang@21cn.com
2001.12.24
我想使用Gzip压缩来压缩java中的输入流。假设我们有一个未压缩的输入流(1GB数据..)。 我希望结果来自源的压缩输入流:public InputStream getCompressedStream(InputStream unCompressedStream) {// Not working because it's uncompressing the stream, I want the ...
Android的网络请求用的是HttpURLConnection的时候,当请求成功的时候会使用 InputStream inputStream = conn.getInputStream();进行数据的接收,这个inputStream就是数据。
今天做项目的时候由于使用的蓝牙打印机,这个打印机根据业务要求需要接收图片,(后端是使用的16进制的字符转存储的这张图片,在c#中打印报表,这个报表就...
nginx 自动解压gzip压缩数据的两种方式:nginx自动解压、后台java程序解压
nginx安装、nginx反向代理/负载均衡、Lua、LuaJIT、openresty、lua-nginx-module、ngx_devel_kit 的安...
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
publ...
一、前言通过java.util.zip.GZIPOutputStream对字符串基于base64(sun.misc.BASE64Encoder().encode)加密压缩compressEncode处理,再经过base64解密(sun.misc.BASE64Decoder().decodeBuffer)后java.util.zip.GZIPInputStream还原解压原始为字符串,详情参见代码示...
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
imp...