Java压缩技术(一) ZLib
原文:http://snowolf.iteye.com/blog/465433
有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。
压缩工具代码如下:
- /**
- * 2009-9-9
- */
- package org.zlex.commons.io;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.zip.Deflater;
- import java.util.zip.DeflaterOutputStream;
- import java.util.zip.Inflater;
- import java.util.zip.InflaterInputStream;
- /**
- * ZLib压缩工具
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- public abstract class ZLibUtils {
- /**
- * 压缩
- *
- * @param data
- * 待压缩数据
- * @return byte[] 压缩后的数据
- */
- public static byte[] compress(byte[] data) {
- byte[] output = new byte[0];
- Deflater compresser = new Deflater();
- compresser.reset();
- compresser.setInput(data);
- compresser.finish();
- ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
- try {
- byte[] buf = new byte[1024];
- while (!compresser.finished()) {
- int i = compresser.deflate(buf);
- bos.write(buf, 0, i);
- }
- output = bos.toByteArray();
- } catch (Exception e) {
- output = data;
- e.printStackTrace();
- } finally {
- try {
- bos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- compresser.end();
- return output;
- }
- /**
- * 压缩
- *
- * @param data
- * 待压缩数据
- *
- * @param os
- * 输出流
- */
- public static void compress(byte[] data, OutputStream os) {
- DeflaterOutputStream dos = new DeflaterOutputStream(os);
- try {
- dos.write(data, 0, data.length);
- dos.finish();
- dos.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 解压缩
- *
- * @param data
- * 待压缩的数据
- * @return byte[] 解压缩后的数据
- */
- public static byte[] decompress(byte[] data) {
- byte[] output = new byte[0];
- Inflater decompresser = new Inflater();
- decompresser.reset();
- decompresser.setInput(data);
- ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
- try {
- byte[] buf = new byte[1024];
- while (!decompresser.finished()) {
- int i = decompresser.inflate(buf);
- o.write(buf, 0, i);
- }
- output = o.toByteArray();
- } catch (Exception e) {
- output = data;
- e.printStackTrace();
- } finally {
- try {
- o.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- decompresser.end();
- return output;
- }
- /**
- * 解压缩
- *
- * @param is
- * 输入流
- * @return byte[] 解压缩后的数据
- */
- public static byte[] decompress(InputStream is) {
- InflaterInputStream iis = new InflaterInputStream(is);
- ByteArrayOutputStream o = new ByteArrayOutputStream(1024);
- try {
- int i = 1024;
- byte[] buf = new byte[i];
- while ((i = iis.read(buf, 0, i)) > 0) {
- o.write(buf, 0, i);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return o.toByteArray();
- }
- }
测试用例代码如下:
- /**
- * 2009-9-9
- */
- package org.zlex.commons.io;
- import static org.junit.Assert.*;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import org.junit.Test;
- /**
- * ZLib压缩测试用例
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- public class ZLibUtilsTest {
- @Test
- public final void testBytes() {
- System.err.println("字节压缩/解压缩测试");
- String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";
- System.err.println("输入字符串:\t" + inputStr);
- byte[] input = inputStr.getBytes();
- System.err.println("输入字节长度:\t" + input.length);
- byte[] data = ZLibUtils.compress(input);
- System.err.println("压缩后字节长度:\t" + data.length);
- byte[] output = ZLibUtils.decompress(data);
- System.err.println("解压缩后字节长度:\t" + output.length);
- String outputStr = new String(output);
- System.err.println("输出字符串:\t" + outputStr);
- assertEquals(inputStr, outputStr);
- }
- @Test
- public final void testFile() {
- String filename = "zlib";
- File file = new File(filename);
- System.err.println("文件压缩/解压缩测试");
- String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";
- System.err.println("输入字符串:\t" + inputStr);
- byte[] input = inputStr.getBytes();
- System.err.println("输入字节长度:\t" + input.length);
- try {
- FileOutputStream fos = new FileOutputStream(file);
- ZLibUtils.compress(input, fos);
- fos.close();
- System.err.println("压缩后字节长度:\t" + file.length());
- } catch (Exception e) {
- fail(e.getMessage());
- }
- byte[] output = null;
- try {
- FileInputStream fis = new FileInputStream(file);
- output = ZLibUtils.decompress(fis);
- fis.close();
- } catch (Exception e) {
- fail(e.getMessage());
- }
- System.err.println("解压缩后字节长度:\t" + output.length);
- String outputStr = new String(output);
- System.err.println("输出字符串:\t" + outputStr);
- assertEquals(inputStr, outputStr);
- }
- }
输入结果
- 字节压缩/解压缩测试
- 输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
- 输入字节长度: 59
- 压缩后字节长度: 39
- 解压缩后字节长度: 59
- 输出字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
- 文件压缩/解压缩测试
- 输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
- 输入字节长度: 59
- 压缩后字节长度: 39
- 解压缩后字节长度: 59
- 输出字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org
应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率!
ZLib压缩对大字节数据压缩,才能反映出压缩效果。![]()
先占个位儿,回头细致整理!![]()
Java压缩技术(一) ZLib的更多相关文章
- Java压缩技术(二) ZIP压缩——Java原生实现
原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZI ...
- Java压缩技术的学习
由于工作的需要,经常要手动去打上线安装包,为了方便,自己写程序去帮助打包.使用过Unix或者Linux的人都基本上都用过tar打包以及gzip压缩,但在Windows下使用得最多的压缩还是RAR和Zi ...
- java 压缩技术
package zip; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStr ...
- Java压缩技术(三) ZIP解压缩——Java原生实现
原文:http://snowolf.iteye.com/blog/642492 JavaEye的朋友跟我说:“你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读”.ok,面向读 ...
- Java后端实现图片压缩技术
今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...
- (转)java缓存技术,记录
http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇 ...
- 深入分析Java Web技术内幕(修订版)
阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著 ISBN 978-7-121- ...
- JAVA缓存技术之EhCache
最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/ar ...
- 转:关于数据库压缩技术的Survey
原文来自于:http://outofmemory.cn/mysql/database-compression-tech 昨天给团队内的小伙伴做了一个关于数据库压缩技术的Survey,现将其中可以公开的 ...
随机推荐
- 计组_IEEE754_练习题
IEEE754 阶码:移码:尾数:原码 一个规格化的32位浮点数x的真值可表示为: x=(-1)^s×(1. M) × 2^(E-127) e=E-127 其中尾数域 ...
- FTP服务器访问主动模式、被动模式
在公司里面,经常需要访问外网FTP取资料等情况.但是有时用windows界面访问经常遇到各种问题. 下面介绍两种客户端是如何访问ftp服务器. 首先我们需要说明:防火墙,是阻拦外界与内部的通讯的一道关 ...
- swift-UINavigationController纯代码自定义导航控制器及底部工具栏的使用
step1:自定义一个类 NTViewController,该类继承UITabBarController: // // NTViewController.swift // Housekeeper / ...
- UNIX C 总结
--day01--王建立QQ:2529866769今天的内容:一.计算机的框架什么是操作系统?(汽车)加油系统 油门 用户跟加油子系统交互的窗口.(接口)方向系统 方向盘 用户跟方向系统的交互接口.导 ...
- (C/C++学习)5.C++中的虚继承-虚函数-多态解析
说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...
- check_nrpe: ERROR - could not complete SSL handshake
情景描述: 发现的问题是 在监控端执行 ./check_nrpe -H 被监控端ip 正常返回nrpe版本 在被监控端执行 ./check_nrpe -H 监控端ip 报错 check_nrpe: E ...
- 【Codeforces 1106D】Lunar New Year and a Wander
[链接] 我是链接,点我呀:) [题意] 让你遍历n个节点,访问过的节点不操作. 如果是没有访问过的点,那就把它加到序列的末尾. 问你形成的最小字典序的序列是多少. [题解] 显然每次找最小的标号 用 ...
- Android DynamicGrid:拖曳交换位置
Android DynamicGrid:拖曳交换位置 Android DynamicGrid是一个第三方开源项目,DynamicGrid在github上的项目主页是:https://github ...
- 用c实现shell排序
shell排序的方法又称缩小增量法,是对直接插入排序法的改进.至于对于分组后采用哪种排序方法实现,本例采用直接选择排序和直接插入排序,理论上讲,通过分组排序后,数据基本上有序,这时通过直接插入排序会比 ...
- PHP array_diff()
定义和用法 array_diff() 函数返回两个数组的差集数组.返回的数组的元素都取自被比较的数组(既第一个数组). 在返回的数组中,键名保持不变. 语法 array_diff(array1,arr ...