文档章节

Java压缩技术(一) ZLib

村长大神
 村长大神
发布于 2014/11/05 13:25
字数 1549
阅读 58
收藏 3
点赞 0
评论 0
应好友需要,整理一下Java的压缩算法,先从ZLib开始。

相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现

有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。

压缩工具代码如下:
Java代码 复制代码  收藏代码
  1. /**  
  2.  * 2009-9-9  
  3.  */  
  4. package org.zlex.commons.io;   
  5.   
  6. import java.io.ByteArrayOutputStream;   
  7. import java.io.IOException;   
  8. import java.io.InputStream;   
  9. import java.io.OutputStream;   
  10. import java.util.zip.Deflater;   
  11. import java.util.zip.DeflaterOutputStream;   
  12. import java.util.zip.Inflater;   
  13. import java.util.zip.InflaterInputStream;   
  14.   
  15. /**  
  16.  * ZLib压缩工具  
  17.  *   
  18.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>  
  19.  * @version 1.0  
  20.  * @since 1.0  
  21.  */  
  22. public abstract class ZLibUtils {   
  23.   
  24.     /**  
  25.      * 压缩  
  26.      *   
  27.      * @param data  
  28.      *            待压缩数据  
  29.      * @return byte[] 压缩后的数据  
  30.      */  
  31.     public static byte[] compress(byte[] data) {   
  32.         byte[] output = new byte[0];   
  33.   
  34.         Deflater compresser = new Deflater();   
  35.   
  36.         compresser.reset();   
  37.         compresser.setInput(data);   
  38.         compresser.finish();   
  39.         ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);   
  40.         try {   
  41.             byte[] buf = new byte[1024];   
  42.             while (!compresser.finished()) {   
  43.                 int i = compresser.deflate(buf);   
  44.                 bos.write(buf, 0, i);   
  45.             }   
  46.             output = bos.toByteArray();   
  47.         } catch (Exception e) {   
  48.             output = data;   
  49.             e.printStackTrace();   
  50.         } finally {   
  51.             try {   
  52.                 bos.close();   
  53.             } catch (IOException e) {   
  54.                 e.printStackTrace();   
  55.             }   
  56.         }   
  57.         compresser.end();   
  58.         return output;   
  59.     }   
  60.   
  61.     /**  
  62.      * 压缩  
  63.      *   
  64.      * @param data  
  65.      *            待压缩数据  
  66.      *   
  67.      * @param os  
  68.      *            输出流  
  69.      */  
  70.     public static void compress(byte[] data, OutputStream os) {   
  71.         DeflaterOutputStream dos = new DeflaterOutputStream(os);   
  72.   
  73.         try {   
  74.             dos.write(data, 0, data.length);   
  75.   
  76.             dos.finish();   
  77.   
  78.             dos.flush();   
  79.         } catch (IOException e) {   
  80.             e.printStackTrace();   
  81.         }   
  82.     }   
  83.   
  84.     /**  
  85.      * 解压缩  
  86.      *   
  87.      * @param data  
  88.      *            待压缩的数据  
  89.      * @return byte[] 解压缩后的数据  
  90.      */  
  91.     public static byte[] decompress(byte[] data) {   
  92.         byte[] output = new byte[0];   
  93.   
  94.         Inflater decompresser = new Inflater();   
  95.         decompresser.reset();   
  96.         decompresser.setInput(data);   
  97.   
  98.         ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);   
  99.         try {   
  100.             byte[] buf = new byte[1024];   
  101.             while (!decompresser.finished()) {   
  102.                 int i = decompresser.inflate(buf);   
  103.                 o.write(buf, 0, i);   
  104.             }   
  105.             output = o.toByteArray();   
  106.         } catch (Exception e) {   
  107.             output = data;   
  108.             e.printStackTrace();   
  109.         } finally {   
  110.             try {   
  111.                 o.close();   
  112.             } catch (IOException e) {   
  113.                 e.printStackTrace();   
  114.             }   
  115.         }   
  116.   
  117.         decompresser.end();   
  118.         return output;   
  119.     }   
  120.   
  121.     /**  
  122.      * 解压缩  
  123.      *   
  124.      * @param is  
  125.      *            输入流  
  126.      * @return byte[] 解压缩后的数据  
  127.      */  
  128.     public static byte[] decompress(InputStream is) {   
  129.         InflaterInputStream iis = new InflaterInputStream(is);   
  130.         ByteArrayOutputStream o = new ByteArrayOutputStream(1024);   
  131.         try {   
  132.             int i = 1024;   
  133.             byte[] buf = new byte[i];   
  134.   
  135.             while ((i = iis.read(buf, 0, i)) > 0) {   
  136.                 o.write(buf, 0, i);   
  137.             }   
  138.   
  139.         } catch (IOException e) {   
  140.             e.printStackTrace();   
  141.         }   
  142.         return o.toByteArray();   
  143.     }   
  144. }  
/**
 * 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();
	}
}

测试用例代码如下:
Java代码 复制代码  收藏代码
  1. /**  
  2.  * 2009-9-9  
  3.  */  
  4. package org.zlex.commons.io;   
  5.   
  6. import static org.junit.Assert.*;   
  7.   
  8. import java.io.File;   
  9. import java.io.FileInputStream;   
  10. import java.io.FileOutputStream;   
  11.   
  12. import org.junit.Test;   
  13.   
  14. /**  
  15.  * ZLib压缩测试用例  
  16.  *   
  17.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>  
  18.  * @version 1.0  
  19.  * @since 1.0  
  20.  */  
  21. public class ZLibUtilsTest {   
  22.   
  23.     @Test  
  24.     public final void testBytes() {   
  25.         System.err.println("字节压缩/解压缩测试");   
  26.         String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";   
  27.         System.err.println("输入字符串:\t" + inputStr);   
  28.         byte[] input = inputStr.getBytes();   
  29.         System.err.println("输入字节长度:\t" + input.length);   
  30.   
  31.         byte[] data = ZLibUtils.compress(input);   
  32.         System.err.println("压缩后字节长度:\t" + data.length);   
  33.   
  34.         byte[] output = ZLibUtils.decompress(data);   
  35.         System.err.println("解压缩后字节长度:\t" + output.length);   
  36.         String outputStr = new String(output);   
  37.         System.err.println("输出字符串:\t" + outputStr);   
  38.   
  39.         assertEquals(inputStr, outputStr);   
  40.     }   
  41.   
  42.     @Test  
  43.     public final void testFile() {   
  44.         String filename = "zlib";   
  45.         File file = new File(filename);   
  46.         System.err.println("文件压缩/解压缩测试");   
  47.         String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";   
  48.         System.err.println("输入字符串:\t" + inputStr);   
  49.         byte[] input = inputStr.getBytes();   
  50.         System.err.println("输入字节长度:\t" + input.length);   
  51.   
  52.         try {   
  53.   
  54.             FileOutputStream fos = new FileOutputStream(file);   
  55.             ZLibUtils.compress(input, fos);   
  56.             fos.close();   
  57.             System.err.println("压缩后字节长度:\t" + file.length());   
  58.         } catch (Exception e) {   
  59.             fail(e.getMessage());   
  60.         }   
  61.   
  62.         byte[] output = null;   
  63.   
  64.         try {   
  65.             FileInputStream fis = new FileInputStream(file);   
  66.             output = ZLibUtils.decompress(fis);   
  67.             fis.close();   
  68.   
  69.         } catch (Exception e) {   
  70.             fail(e.getMessage());   
  71.         }   
  72.         System.err.println("解压缩后字节长度:\t" + output.length);   
  73.         String outputStr = new String(output);   
  74.         System.err.println("输出字符串:\t" + outputStr);   
  75.   
  76.         assertEquals(inputStr, outputStr);   
  77.     }   
  78. }  
/**
 * 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);
	}
}

输入结果
Consloe代码 复制代码  收藏代码
  1. 字节压缩/解压缩测试   
  2. 输入字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org   
  3. 输入字节长度: 59  
  4. 压缩后字节长度:    39  
  5. 解压缩后字节长度:   59  
  6. 输出字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org   
  7. 文件压缩/解压缩测试   
  8. 输入字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org   
  9. 输入字节长度: 59  
  10. 压缩后字节长度:    39  
  11. 解压缩后字节长度:   59  
  12. 输出字符串:  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
文件压缩/解压缩测试
输入字符串:	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压缩对大字节数据压缩,才能反映出压缩效果。
先占个位儿,回头细致整理!

本文转载自:http://snowolf.iteye.com/blog/465433

共有 人打赏支持
村长大神
粉丝 162
博文 247
码字总数 682279
作品 0
杭州
程序员
阿里获邀加入 JCP ,参与制定 Java 全球标准和技术规范

2018年5月17日,作为唯一中国代表,阿里巴巴获邀加入 Java 全球管理组织 Java Community Process (JCP) 的最高执行委员会。此次获得执行委员会席位,让中国企业首次加入到 Java 全球标准的制...

王练 ⋅ 05/17 ⋅ 5

燃!Java全球标准中国人参与制定,阿里成首个受邀中国公司

2018年5月17日,作为唯一中国代表,阿里巴巴获邀加入Java全球管理组织Java Community Process (JCP)的最高执行委员会。此次获得执行委员会席位,让中国企业首次加入到Java全球标准的制定中,...

技术小能手 ⋅ 05/17 ⋅ 0

【小马哥】Spring Cloud系列讲座

这里为大家推荐一个不错的Spring Cloud系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施...

杜琪 ⋅ 03/02 ⋅ 0

百词斩Java程序员面试11个问题,你会几个?2018-04-10

近日,我们在w3cschool app开发者头条上,可以看到百词斩Java程序员面经。 在分享百词斩Java面经前,w3cschool特别给程序员小伙伴们带来一些Java学习干货: 0、学习Java必备的3大神器 如果你...

W3Cschool ⋅ 04/10 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Hadoop的本地库(Native Libraries)及相关问题总结

主体转自:http://blog.sina.com.cn/s/blog3d9e90ad0102wqrp.html (未亲测,我的getconf LONGBIT返回32,且file libhadoop.so.1.0.0返回64,与之相反) Hadoop的本地库(Native Libraries)...

u013303361 ⋅ 04/23 ⋅ 0

【小马哥】Spring Boot系列讲座

这里为大家推荐一个不错的Spring Boot系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、...

杜琪 ⋅ 03/02 ⋅ 0

JavaWeb07-HTML篇笔记(二)

1.1 案例一:使用JDBC完成CRUD的操作:1.1.1 需求: 对分类管理使用JDBC进行CRUD的操作. 1.1.2 分析:1.1.2.1 技术分析: 【JDBC的概述】 Ø JDBC:Java DataBase Connectivity Java数据库的连...

我是小谷粒 ⋅ 05/16 ⋅ 0

Ubuntu 16.04安装JDK/JRE并配置环境变量(为虚拟机配置JAVA环境)

由于需要安装交通仿真工具VanetMobiSim,而它又需要工作在Java环境,所以首先把安装Java环境的过程记录下来。 操作环境:VMware Workstation 10 安装包百度云链接:https://pan.baidu.com/s...

wuzhiwuweisun ⋅ 05/29 ⋅ 0

5月份值得一看的 Java 技术干货!

5月又即将要离我们远去了,这个月有小长假51劳动节,有54青年节,有513母亲节,更有坑爹的520神马节?!! 废话不说,又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,都是...

Java技术栈 ⋅ 05/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部