原文: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. jquery 零碎笔记

    toggle使用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  2. mysql_基础1

    初学mysql,感觉挺有意思的. mysql指令的一些参数: promrt修改提示符:   PROMPT \D mysql的语法规范: 一些函数: 创建数据库: SHOW CREATE DATABAS ...

  3. GatewayWorker + LayIM实现即时聊天

    一.程序目录结构 二.代码展示 附LayIM开发文档:https://www.layui.com/doc/modules/layim.html 1.前端代码 <!DOCTYPE html> ...

  4. .net 内嵌 GeckoWebBrowser (firefox) 核心浏览器

    引用nuget包: 注意:Geckofx45 nuget包必须是最后引用,否则初始化会出错 简单示例: using Gecko; using System; using System.Collecti ...

  5. CAD绘制一个线型标注(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...

  6. 基础:Post和Get区别

    1.get是从服务器上获取数据,post是向服务器传送数据.2.在客户端, get方式在通过URL提交数据,数据在URL中可以看到:post方式,数据放置在HTML HEADER内提交3.对于get方 ...

  7. java基本类型和包装类型的区别以及object的公共方法

    Java的类型分为两部分,一个是基本类型(primitive),如int.double等八种基本数据类型: 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节 ...

  8. [C++] 配平化学方程式算法的封装

    有人已经实现了配平的方法,在此不再重复介绍. https://www.cnblogs.com/Elfish/p/7631603.html 但是,上述的方法所提供的代码还是存在着问题,需要进一步修改. ...

  9. 【Android】登陆界面设计

    界面布局 布局其实很简单,用相对布局累起来就可以了,然后注册和记住密码这两个控件放在一个水平线性布局里 界面底部还设置了一个QQ一键登录的入口,可以直接用. 控件的ID命名有点乱 <?xml v ...

  10. CTF实战(隐写术):欢迎来到地狱

    前言:请登录实验吧开启刷题模式,拿到的flag返回该网站验证正确性. 下载“欢迎来到地狱”CTF题目(总共三个文件