原文: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. 发布自己的nuget包

    1.先到www.nuget.org注册账户,然后在用户中心获取apikey 2.到https://dist.nuget.org/index.html下载最新的nuget.exe,放到你的项目根目录下 ...

  2. 初学者怎么才能快速学会Python?

    提起对Python的印象,除了全能之外恐怕就是简单易学了.很多人都在推荐新手学Python入门,毕竟语法简单.语句简洁,所谓“人生苦短我用Python”绝不是一句空话.不过也不能忽视一点:Python ...

  3. 怎么用最短时间高效而踏实地学习Python?

    之所以写这篇文章,在标题里已经表达得很清楚了.做技术的人都知道,时间就是金钱不是一句空话,同一个技术,你比别人早学会半年,那你就能比别人多拿半年的钱.所以有时候别人去培训我也不怎么拦着,为什么?因为培 ...

  4. Linux常用解压缩命令

    压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f filen ...

  5. SprinMVC接收参数乱码解决篇

    1.Spring 默认的字符编码格式为iso-8859-1,为此Spring专门提供了字符过滤器org.springframework.web.filter.CharacterEncodingFilt ...

  6. 【codeforces 761E】Dasha and Puzzle

    [题目链接]:http://codeforces.com/contest/761/problem/E [题意] 给你一棵树,让你在平面上选定n个坐标; 使得这棵树的连接关系以二维坐标的形式展现出来; ...

  7. ggplot画图笔记

    1.数据集相加符号 %+% 2.图形属性映射 aesc()函数 aes(x=mpg,y=wt)  把mpg属性映射为x,wt属性映射为y 图层图形属性可以添加.修改和删除映射. 如 3.位置调整参数 ...

  8. nyoj_111_分数加减法_201311281341

    分数加减法 时间限制:3000 ms  |           内存限制:65535 KB 难度:2   描述 编写一个C程序,实现两个分数的加减法   输入 输入包含多行数据 每行数据是一个字符串, ...

  9. 洛谷 P3078 [USACO13MAR]扑克牌型Poker Hands

    P3078 [USACO13MAR]扑克牌型Poker Hands 题目描述 Bessie and her friends are playing a unique version of poker ...

  10. Javascript中数据与字符串互转(转)

    数组与字符串的相互转化 <script type="text/javascript"> var obj="new1abcdefg".replace( ...