原文:http://snowolf.iteye.com/blog/465433

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

压缩工具代码如下:

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

测试用例代码如下:

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

输入结果

  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

应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率!

ZLib压缩对大字节数据压缩,才能反映出压缩效果。

先占个位儿,回头细致整理!

Java压缩技术(一) ZLib的更多相关文章

  1. Java压缩技术(二) ZIP压缩——Java原生实现

    原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZI ...

  2. Java压缩技术的学习

    由于工作的需要,经常要手动去打上线安装包,为了方便,自己写程序去帮助打包.使用过Unix或者Linux的人都基本上都用过tar打包以及gzip压缩,但在Windows下使用得最多的压缩还是RAR和Zi ...

  3. java 压缩技术

    package zip; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStr ...

  4. Java压缩技术(三) ZIP解压缩——Java原生实现

    原文:http://snowolf.iteye.com/blog/642492 JavaEye的朋友跟我说:“你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读”.ok,面向读 ...

  5. Java后端实现图片压缩技术

    今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...

  6. (转)java缓存技术,记录

    http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇 ...

  7. 深入分析Java Web技术内幕(修订版)

    阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著   ISBN 978-7-121- ...

  8. JAVA缓存技术之EhCache

    最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/ar ...

  9. 转:关于数据库压缩技术的Survey

    原文来自于:http://outofmemory.cn/mysql/database-compression-tech 昨天给团队内的小伙伴做了一个关于数据库压缩技术的Survey,现将其中可以公开的 ...

随机推荐

  1. 微服务的一种开源实现方式——dubbo+zookeeper

    转自: http://blog.csdn.NET/zhdd99/article/details/52263609 微服务架构成了当下的技术热点,实现微服务是要付出很大成本的,但也许是因为微服务的优点太 ...

  2. Python 之糗事百科多线程爬虫案例

    import requests from lxml import etree import json import threading import queue # 采集html类 class Get ...

  3. CAD从二制流数据中加载图形(com接口)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  4. DOClever线下部署安装说明文档

    先本地要安装node环境,推荐6.10.0版本 到nodejs官网进行下载window版本进行安装,这里就不做说明了  接下来我们开始安装mongodb,首先下载mongodb  下载完成后我们一路 ...

  5. 从0开始复习JS---1、函数复习

    1. 写一个函数,实现对数字数组的排序. function get_order(array){ for(var i = 0; i <array.length-1; i++){ for(var j ...

  6. Java报表统计导出Word-xdocin方式

    官网:http://www.xdocin.com Controller层: //创建对象 XDocService xdocService = new XDocService(); //封装参数 Map ...

  7. HUD 1426 Sudoku Killer (DFS)

    链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...

  8. Silverlight之我见——数据批示(2)

    接着上一回的话题,继续来研究数据批示特性,先拿简单的RageAttribute来弄弄,接着上次的示例,添加一个Age属性,并加上RangeAttribute. [Range(20,60,ErrorMe ...

  9. Python类中的 私有变量和私有方法

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  10. 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...