Java压缩技术(一) ZLib

时间:2022-09-08 12:20:35

原文: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

先占个位儿,回头细致整理!Java压缩技术(一) 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. 转&colon;关于数据库压缩技术的Survey

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

随机推荐

  1. 11 个很少人知道但很有用的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  2. WINDOWS渗透与提权总结&lpar;2&rpar;

    vbs 下载者: 01 1: 02   03 echo Set sGet = createObject("ADODB.Stream") >>c:\windows\cft ...

  3. 活动组件(五):一个activity的例子

    建立两个Activity,一个是NormalActivity,另一个是DialogActivity.首先建立这两个Activity的布局文件,如下图: 然后编写这连个Activity,如下: 接着对这 ...

  4. TextView里的文 html

    一.[Android实例]实现TextView里的文字有不同颜色 转eoe:http://www.eoeandroid.com/thread-4496-1-1.html import android. ...

  5. Git 提交后开始自动构建

    设定Git仓库的钩子 一般路径为 xxx.git/hooks 参考文档 https://git-scm.com/docs/githooks 修改 post-receive #!/bin/bash wh ...

  6. 针对Oracle数据库表中的数据的常见操作

    1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名  for update; 例:sele ...

  7. Java EE Expression Language

    什么是EL? 形如这样(立即执行的): ${sessionScope.cart.total} 或者这样(延迟执行的): #{customer.name} 的表达式语言(Expression Langu ...

  8. 网站遭受CC攻击的解决办法

    前两天,网站的注册发送手机短信验证码的接口受到攻击,一个半小时,1万条短信都发出去了.可见,我们的安全防护做的多么不好. 分析攻击方式: 1) 多台机器模拟人工操作,随机输入手机号,就点击发送短信: ...

  9. Git和GitHub入门基础

    -----------------------------------------//cd F:/learngit // 创建仓库git init  // 在当前目录下创建空的git仓库------- ...

  10. SpringBoot Tips

    读取资源文件 @RestController @EnableAutoConfiguration public class ResourcesController { @Autowired privat ...