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,现将其中可以公开的 ...
随机推荐
- 微服务的一种开源实现方式——dubbo+zookeeper
转自: http://blog.csdn.NET/zhdd99/article/details/52263609 微服务架构成了当下的技术热点,实现微服务是要付出很大成本的,但也许是因为微服务的优点太 ...
- Python 之糗事百科多线程爬虫案例
import requests from lxml import etree import json import threading import queue # 采集html类 class Get ...
- CAD从二制流数据中加载图形(com接口)
主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...
- DOClever线下部署安装说明文档
先本地要安装node环境,推荐6.10.0版本 到nodejs官网进行下载window版本进行安装,这里就不做说明了 接下来我们开始安装mongodb,首先下载mongodb 下载完成后我们一路 ...
- 从0开始复习JS---1、函数复习
1. 写一个函数,实现对数字数组的排序. function get_order(array){ for(var i = 0; i <array.length-1; i++){ for(var j ...
- Java报表统计导出Word-xdocin方式
官网:http://www.xdocin.com Controller层: //创建对象 XDocService xdocService = new XDocService(); //封装参数 Map ...
- HUD 1426 Sudoku Killer (DFS)
链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...
- Silverlight之我见——数据批示(2)
接着上一回的话题,继续来研究数据批示特性,先拿简单的RageAttribute来弄弄,接着上次的示例,添加一个Age属性,并加上RangeAttribute. [Range(20,60,ErrorMe ...
- Python类中的 私有变量和私有方法
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...
- 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...