熟悉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原生实现相关推荐

  1. java压缩_Java压缩

    java压缩 在最近的项目中,我们不得不做一些我个人从未真正看过的事情. 压缩. 我们需要拍摄几个文件和图像,将它们压缩并提供给FTP使用,是的,总有一天,感觉确实回到了90年代. 除了过去的FTP之 ...

  2. java 沙箱_Java沙箱技术

    自从Java技术出现以来,有关Java平台的安全性及由Java技术发展所引发的新的安全性问题,引起了越来越多的关注.目前,Java已经大量应用在各个领域,研究Java的安全 性对于更好地使用Java具 ...

  3. java 模块化_Java 9 新特性 - 模块化 - Java 技术驿站-Java 技术驿站

    Java 9 最大的特性就是模块化 ( Module ) 了.本章,我们就对这个 模块化 进行一些简单的讲解,包括 Java 9 模块化的概念.如何实现.如何使用等 对于 Java 9 来说,模块化 ...

  4. java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP

    知了堂在教学过程中一直十分注重学员的实践能力,每阶段结束必有项目考核,全面检验分析学员学习效果.为更好的进行下一阶段的课程学习,本周一Java32班学员迎来了第二阶段的项目考核. 让我们来看看此次考核 ...

  5. Java的三个技术平台以及Java语言的特点

    (1)Java SE 标准版 Java Standard Edition 开发普通桌面和商务应用程序,包括Java最核心的类库(集合.数据库连接.网络编程等等). 1995年5月Java语言诞生,20 ...

  6. 怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

    我们都知道要运行Java代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要 ...

  7. java byte 压缩_java压缩和解压字符串,Byte数组,String

    /*** * 压缩GZip * *@paramdata *@return */ public static byte[] gZip(byte[] data) {byte[] b = null;try{ ...

  8. java生成unix.z压缩_JAVA压缩 解压缩zip 并解决linux下中文乱码

    1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar 如果是文件目录,则 ZipEntry zipEntry=new ZipEntry(basePath + System.g ...

  9. java 视频压缩_Java 压缩视频(无需安装插件)

    亲测可用,基于ffmpeg 去进行压缩, 测试原视频大小:835.87 MB 压缩后大小:118.8 MB 压缩比率 :85.78% 好了,开始上代码 1.首先 pom文件中引入下面两个 jar 包 ...

最新文章

  1. LeetCode 215. Kth Largest Element in an Array--数字第K大的元素--最大堆或优先队列--C++,Python解法
  2. linux io100的原因_Linux学习笔记(九)软件包管理
  3. 【Kaggle-MNIST之路】CNN+改进过的损失函数(三)
  4. Keras学习笔记:序列式模型
  5. spark中dataframe解析_SparkSql 中 JOIN的实现
  6. PerfMa“寒泉子”李嘉鹏:成长和创业都要能人所不能,真强者何惧资本寒冬
  7. dj电商-模型类设计-1.x-用户模块的两张表
  8. 创建的Maven Web工程无法部署到服务器及web-app_2_3.dtd规范
  9. QT-提示“database not open”
  10. teamtalk部署启动顺序
  11. TC8:UDP_FIELDS_01-16
  12. Windows Server 2012 磁盘管理
  13. eclipse:解决 The word is not correctly spelled问题
  14. PIC16F877A单片机 (中断与定时器Timer1)
  15. 物联网传感技术-----无线传感网概述
  16. Python爬虫+可视化实例:网易云音乐歌单
  17. 开发票服务器返回信息为空,使用 getinvoicebatch 批量接口获取发票信息,返回成功,但数据是空的...
  18. 【OpenCV 例程 300篇】222. 特征提取之弗里曼链码(Freeman chain code)
  19. SuMa++: Efficient LiDAR-based Semantic SLAM
  20. 《信用管理》--信用评分方法之Z评分模型、ZETA评分模型

热门文章

  1. 如何在Mac上刻录DVD以获取可播放的视频?
  2. 征信大数据的盈利模式,怎么赚钱?
  3. DB2 TSA资源查看
  4. HTTP协议的 “无连接,无状态”
  5. 怀揣坚定与执着,踏实稳步向前
  6. Pandas Dataframe 每隔n行取1行
  7. Dundas BI 8.0 is Crack
  8. 使用Keras进行深度学习:(一)Keras 入门
  9. 将英文kali改成中文kali
  10. 【AWVS】python调AWVS接口 新建扫描并导出扫描报告(一)