gzip java 压缩_Java压缩技术(四) GZIP——Java原生实现
熟悉linux的朋友可能都用过文件压缩命令,譬如最为简单的gzip命令。
相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现
GZIP常常用在linxu环境下,是一种非常简单的压缩算法。在Java实现API中,它仅仅包含两个实现类:GZIPInputStream和GZIPOutputStream。
GZIPOutputStream类用于压缩
GZIPInputStream类用于解压缩
先说压缩实现,GZIPOutputStream只有一个方法用于压缩,就是带定长的write方法。简单调用如下文所示:
/**
* 数据压缩
*
* @param is
* @param os
* @throws Exception
*/
public static void compress(InputStream is, OutputStream os)
throws Exception {
GZIPOutputStream gos = new GZIPOutputStream(os);
int count;
byte data[] = new byte[BUFFER];
while ((count = is.read(data, 0, BUFFER)) != -1) {
gos.write(data, 0, count);
}
gos.finish();
gos.flush();
gos.close();
}
记得完成操作后,调用finish方法和flush方法!
核心的压缩实现就这么多!
对于解压缩,GZIPInputStream也对应GZIPOutputStream提供了一个带定长的read方法。简单调用如下文所示:
/**
* 数据解压缩
*
* @param is
* @param os
* @throws Exception
*/
public static void decompress(InputStream is, OutputStream os)
throws Exception {
GZIPInputStream gis = new GZIPInputStream(is);
int count;
byte data[] = new byte[BUFFER];
while ((count = gis.read(data, 0, BUFFER)) != -1) {
os.write(data, 0, count);
}
gis.close();
}
就这么简单!
核心内容完毕!
顺便补充一下,在liunx下操作gzip命令
gzip file用于压缩,如gzip a.txt将得到文件a.txt.gz,同时删除文件a.txt!。
gzip -d file.gz用于解压缩,如gzip -d a.txt.gz将得到文件a.txt,同时删除文件a.txt.gz!。
根据这些特性,我补充了相应的文件操作实现,详见下文!
完整实现:
/**
* 2010-4-13
*/
package org.zlex.commons.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* GZIP工具
*
* @author 梁栋
* @since 1.0
*/
public abstract class GZipUtils {
public static final int BUFFER = 1024;
public static final String EXT = ".gz";
/**
* 数据压缩
*
* @param data
* @return
* @throws Exception
*/
public static byte[] compress(byte[] data) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 压缩
compress(bais, baos);
byte[] output = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return output;
}
/**
* 文件压缩
*
* @param file
* @throws Exception
*/
public static void compress(File file) throws Exception {
compress(file, true);
}
/**
* 文件压缩
*
* @param file
* @param delete
* 是否删除原始文件
* @throws Exception
*/
public static void compress(File file, boolean delete) throws Exception {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);
compress(fis, fos);
fis.close();
fos.flush();
fos.close();
if (delete) {
file.delete();
}
}
/**
* 数据压缩
*
* @param is
* @param os
* @throws Exception
*/
public static void compress(InputStream is, OutputStream os)
throws Exception {
GZIPOutputStream gos = new GZIPOutputStream(os);
int count;
byte data[] = new byte[BUFFER];
while ((count = is.read(data, 0, BUFFER)) != -1) {
gos.write(data, 0, count);
}
gos.finish();
gos.flush();
gos.close();
}
/**
* 文件压缩
*
* @param path
* @throws Exception
*/
public static void compress(String path) throws Exception {
compress(path, true);
}
/**
* 文件压缩
*
* @param path
* @param delete
* 是否删除原始文件
* @throws Exception
*/
public static void compress(String path, boolean delete) throws Exception {
File file = new File(path);
compress(file, delete);
}
/**
* 数据解压缩
*
* @param data
* @return
* @throws Exception
*/
public static byte[] decompress(byte[] data) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 解压缩
decompress(bais, baos);
data = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return data;
}
/**
* 文件解压缩
*
* @param file
* @throws Exception
*/
public static void decompress(File file) throws Exception {
decompress(file, true);
}
/**
* 文件解压缩
*
* @param file
* @param delete
* 是否删除原始文件
* @throws Exception
*/
public static void decompress(File file, boolean delete) throws Exception {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file.getPath().replace(EXT,
""));
decompress(fis, fos);
fis.close();
fos.flush();
fos.close();
if (delete) {
file.delete();
}
}
/**
* 数据解压缩
*
* @param is
* @param os
* @throws Exception
*/
public static void decompress(InputStream is, OutputStream os)
throws Exception {
GZIPInputStream gis = new GZIPInputStream(is);
int count;
byte data[] = new byte[BUFFER];
while ((count = gis.read(data, 0, BUFFER)) != -1) {
os.write(data, 0, count);
}
gis.close();
}
/**
* 文件解压缩
*
* @param path
* @throws Exception
*/
public static void decompress(String path) throws Exception {
decompress(path, true);
}
/**
* 文件解压缩
*
* @param path
* @param delete
* 是否删除原始文件
* @throws Exception
*/
public static void decompress(String path, boolean delete) throws Exception {
File file = new File(path);
decompress(file, delete);
}
}
罗嗦了半天,到底行不行?
来个测试用例,测试用例如下所示:
/**
* 2010-4-13
*/
package org.zlex.commons.compress.compress;
import static org.junit.Assert.assertEquals;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.junit.Test;
/**
* @author 梁栋
* @since 1.0
*/
public class GZipUtilsTest {
private String inputStr = "zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org";
@Test
public final void testDataCompress() throws Exception {
System.err.println("原文:\t" + inputStr);
byte[] input = inputStr.getBytes();
System.err.println("长度:\t" + input.length);
byte[] data = GZipUtils.compress(input);
System.err.println("压缩后:\t");
System.err.println("长度:\t" + data.length);
byte[] output = GZipUtils.decompress(data);
String outputStr = new String(output);
System.err.println("解压缩后:\t" + outputStr);
System.err.println("长度:\t" + output.length);
assertEquals(inputStr, outputStr);
}
@Test
public final void testFileCompress() throws Exception {
FileOutputStream fos = new FileOutputStream("d:/f.txt");
fos.write(inputStr.getBytes());
fos.flush();
fos.close();
GZipUtils.compress("d:/f.txt", false);
GZipUtils.decompress("d:/f.txt.gz", false);
File file = new File("d:/f.txt");
FileInputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fis);
byte[] data = new byte[(int) file.length()];
dis.readFully(data);
fis.close();
String outputStr = new String(data);
assertEquals(inputStr, outputStr);
}
}
结果如何?
先看testDataCompress()方法控制台输出结果。
控制台输出如下:
引用
原文:zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org
长度:52
压缩后:
长度:45
解压缩后:zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org
长度:52
这里使用英文字符做测试,当输入字符串的字节数大于50左右时,压缩效果明显;如果这里使用中文压缩,可能当压缩上千字节时方能体现出压缩效果!
对于文件操作,朋友们可以自行实验,我代码里的实现是按照gzip命令来的!
举例来说:
压缩时,将文件a.txt压缩为a.txt.gz,同时删除文件a.txt。
解压缩时,将文件a.txt.gz解压缩为a.txt,同时删除文件a.txt.gz。
注意执行testFileCompress方法,查看产生的文件!
你大可以放到linux上去做验证!
commons也提供了GZIP算法的实现,甚至更多种压缩算法(tar、bzip2等)的实现,有机会我将继续整理!
相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现
gzip.rar (1.5 KB)
下载次数: 522
19
顶
6
踩
分享到:
2010-04-13 17:24
浏览 94577
评论
11 楼
Horse_Chasing
2016-12-28
垃圾代码垃圾代码
10 楼
ustcstj
2014-07-09
博主你好,我将你的代码稍微修改后放到安卓平台上运行,针对下面这个语句出现一个问题
byte[] data = GZipUtils.compress(input);
System.err.println("压缩后:\t");
System.err.println("长度:\t" + data.length);
我将println换成了log.i("tag1","String.valueof(data.length)");
在data.length这里出错,eclipse说data没有length变量,希望博主解惑
9 楼
Alicus520
2010-11-05
谢谢了!!
8 楼
snowolf
2010-09-26
forchenyun 写道
hi,我目前需要极高效的压缩,对Java自己的gzip实现不是很放心。
gzip据说有c写的代码,Java本地调用,不知道博主有研究吗?
JNI实现,效率也难说!我只是整体整理,对各个算法尚无深度研究!
7 楼
forchenyun
2010-09-26
hi,我目前需要极高效的压缩,对Java自己的gzip实现不是很放心。
gzip据说有c写的代码,Java本地调用,不知道博主有研究吗?
6 楼
snowolf
2010-04-14
snowolf 写道
iamzealotwang 写道
snowolf 写道
iamzealotwang 写道
你好 我有一个问题想请教一下
我是一名前端工程师,有关GZip这种东西不是很懂,不过我有一个需求
前端需要从后端load一份xml文件 之前的做法都是我自己用zip压缩xml文件然后再从后端load过来解压。不过后端的同事和我说 不用那么麻烦,说xml在http传输的时候直接被gzip压缩了。
我想问一下 这样做对后端的压力大么? 还有就是听说这种方式对ie6 ie7的支持不好 有这回事么? 谢谢。
首先说压力,如果文件/数据超级大,那么不管是压缩,还是解压缩都是很大的。一般情况的操作不至于造成多大的压力。至于这一点,鱼与熊掌不可兼得,只要把握好一个量度即可!
再说IE,IE的确有这个问题,广泛的来说兼容性成问题。抽空我试试看,看看是不是在其他浏览器中也如此!
谢谢 :)
稍后,我补充一个使用gzip构建的网络流,IE的确是不支持的!
FireFox、Opera都能够很好的支持!
兄弟,看这里http://snowolf.iteye.com/blog/643443!
5 楼
snowolf
2010-04-14
iamzealotwang 写道
snowolf 写道
iamzealotwang 写道
你好 我有一个问题想请教一下
我是一名前端工程师,有关GZip这种东西不是很懂,不过我有一个需求
前端需要从后端load一份xml文件 之前的做法都是我自己用zip压缩xml文件然后再从后端load过来解压。不过后端的同事和我说 不用那么麻烦,说xml在http传输的时候直接被gzip压缩了。
我想问一下 这样做对后端的压力大么? 还有就是听说这种方式对ie6 ie7的支持不好 有这回事么? 谢谢。
首先说压力,如果文件/数据超级大,那么不管是压缩,还是解压缩都是很大的。一般情况的操作不至于造成多大的压力。至于这一点,鱼与熊掌不可兼得,只要把握好一个量度即可!
再说IE,IE的确有这个问题,广泛的来说兼容性成问题。抽空我试试看,看看是不是在其他浏览器中也如此!
谢谢 :)
稍后,我补充一个使用gzip构建的网络流,IE的确是不支持的!
FireFox、Opera都能够很好的支持!
4 楼
iamzealotwang
2010-04-14
snowolf 写道
iamzealotwang 写道
你好 我有一个问题想请教一下
我是一名前端工程师,有关GZip这种东西不是很懂,不过我有一个需求
前端需要从后端load一份xml文件 之前的做法都是我自己用zip压缩xml文件然后再从后端load过来解压。不过后端的同事和我说 不用那么麻烦,说xml在http传输的时候直接被gzip压缩了。
我想问一下 这样做对后端的压力大么? 还有就是听说这种方式对ie6 ie7的支持不好 有这回事么? 谢谢。
首先说压力,如果文件/数据超级大,那么不管是压缩,还是解压缩都是很大的。一般情况的操作不至于造成多大的压力。至于这一点,鱼与熊掌不可兼得,只要把握好一个量度即可!
再说IE,IE的确有这个问题,广泛的来说兼容性成问题。抽空我试试看,看看是不是在其他浏览器中也如此!
谢谢 :)
3 楼
qianhd
2010-04-14
除了不支持加密解密什么都好
2 楼
snowolf
2010-04-14
iamzealotwang 写道
你好 我有一个问题想请教一下
我是一名前端工程师,有关GZip这种东西不是很懂,不过我有一个需求
前端需要从后端load一份xml文件 之前的做法都是我自己用zip压缩xml文件然后再从后端load过来解压。不过后端的同事和我说 不用那么麻烦,说xml在http传输的时候直接被gzip压缩了。
我想问一下 这样做对后端的压力大么? 还有就是听说这种方式对ie6 ie7的支持不好 有这回事么? 谢谢。
首先说压力,如果文件/数据超级大,那么不管是压缩,还是解压缩都是很大的。一般情况的操作不至于造成多大的压力。至于这一点,鱼与熊掌不可兼得,只要把握好一个量度即可!
再说IE,IE的确有这个问题,广泛的来说兼容性成问题。抽空我试试看,看看是不是在其他浏览器中也如此!
1 楼
iamzealotwang
2010-04-13
你好 我有一个问题想请教一下
我是一名前端工程师,有关GZip这种东西不是很懂,不过我有一个需求
前端需要从后端load一份xml文件 之前的做法都是我自己用zip压缩xml文件然后再从后端load过来解压。不过后端的同事和我说 不用那么麻烦,说xml在http传输的时候直接被gzip压缩了。
我想问一下 这样做对后端的压力大么? 还有就是听说这种方式对ie6 ie7的支持不好 有这回事么? 谢谢。
gzip java 压缩_Java压缩技术(四) GZIP——Java原生实现相关推荐
- java压缩_Java压缩
java压缩 在最近的项目中,我们不得不做一些我个人从未真正看过的事情. 压缩. 我们需要拍摄几个文件和图像,将它们压缩并提供给FTP使用,是的,总有一天,感觉确实回到了90年代. 除了过去的FTP之 ...
- java 沙箱_Java沙箱技术
自从Java技术出现以来,有关Java平台的安全性及由Java技术发展所引发的新的安全性问题,引起了越来越多的关注.目前,Java已经大量应用在各个领域,研究Java的安全 性对于更好地使用Java具 ...
- java 模块化_Java 9 新特性 - 模块化 - Java 技术驿站-Java 技术驿站
Java 9 最大的特性就是模块化 ( Module ) 了.本章,我们就对这个 模块化 进行一些简单的讲解,包括 Java 9 模块化的概念.如何实现.如何使用等 对于 Java 9 来说,模块化 ...
- java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP
知了堂在教学过程中一直十分注重学员的实践能力,每阶段结束必有项目考核,全面检验分析学员学习效果.为更好的进行下一阶段的课程学习,本周一Java32班学员迎来了第二阶段的项目考核. 让我们来看看此次考核 ...
- Java的三个技术平台以及Java语言的特点
(1)Java SE 标准版 Java Standard Edition 开发普通桌面和商务应用程序,包括Java最核心的类库(集合.数据库连接.网络编程等等). 1995年5月Java语言诞生,20 ...
- 怎么运行java虚拟机_Java代码如何运行在Java虚拟机中
我们都知道要运行Java代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要 ...
- java byte 压缩_java压缩和解压字符串,Byte数组,String
/*** * 压缩GZip * *@paramdata *@return */ public static byte[] gZip(byte[] data) {byte[] b = null;try{ ...
- java生成unix.z压缩_JAVA压缩 解压缩zip 并解决linux下中文乱码
1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar 如果是文件目录,则 ZipEntry zipEntry=new ZipEntry(basePath + System.g ...
- java 视频压缩_Java 压缩视频(无需安装插件)
亲测可用,基于ffmpeg 去进行压缩, 测试原视频大小:835.87 MB 压缩后大小:118.8 MB 压缩比率 :85.78% 好了,开始上代码 1.首先 pom文件中引入下面两个 jar 包 ...
最新文章
- LeetCode 215. Kth Largest Element in an Array--数字第K大的元素--最大堆或优先队列--C++,Python解法
- linux io100的原因_Linux学习笔记(九)软件包管理
- 【Kaggle-MNIST之路】CNN+改进过的损失函数(三)
- Keras学习笔记:序列式模型
- spark中dataframe解析_SparkSql 中 JOIN的实现
- PerfMa“寒泉子”李嘉鹏:成长和创业都要能人所不能,真强者何惧资本寒冬
- dj电商-模型类设计-1.x-用户模块的两张表
- 创建的Maven Web工程无法部署到服务器及web-app_2_3.dtd规范
- QT-提示“database not open”
- teamtalk部署启动顺序
- TC8:UDP_FIELDS_01-16
- Windows Server 2012 磁盘管理
- eclipse:解决 The word is not correctly spelled问题
- PIC16F877A单片机 (中断与定时器Timer1)
- 物联网传感技术-----无线传感网概述
- Python爬虫+可视化实例:网易云音乐歌单
- 开发票服务器返回信息为空,使用 getinvoicebatch 批量接口获取发票信息,返回成功,但数据是空的...
- 【OpenCV 例程 300篇】222. 特征提取之弗里曼链码(Freeman chain code)
- SuMa++: Efficient LiDAR-based Semantic SLAM
- 《信用管理》--信用评分方法之Z评分模型、ZETA评分模型