Java压缩技术(一) ZLib

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

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

压缩工具代码如下:

Java代码  

  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:[email protected]">梁栋</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. }

测试用例代码如下:

Java代码  

  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:[email protected]">梁栋</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 = "[email protected];[email protected];[email protected]";
  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 = "[email protected];[email protected];[email protected]";
  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. }

输入结果

Consloe代码  

  1. 字节压缩/解压缩测试
  2. 输入字符串:  [email protected];[email protected];[email protected]
  3. 输入字节长度: 59
  4. 压缩后字节长度:    39
  5. 解压缩后字节长度:   59
  6. 输出字符串:  [email protected];[email protected];[email protected]
  7. 文件压缩/解压缩测试
  8. 输入字符串:  [email protected];[email protected];[email protected]
  9. 输入字节长度: 59
  10. 压缩后字节长度:    39
  11. 解压缩后字节长度:   59
  12. 输出字符串:  [email protected];[email protected];[email protected]

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

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

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

时间: 2024-11-06 17:28:54

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

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

原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZIP的java原生实现. 看了几篇zip压缩算法的帖子,讲的算是比较细致了,但就是没有对应的解压缩实现,太惜败了! 我就喜欢没事做总结,稍作整理,将其收纳! 相关链接: Java压缩技术(一) ZLib Java压缩技术(二) ZIP压缩——Java原生实现 Java压缩技术(三) ZIP解压缩——J

java 压缩技术

package zip; 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

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

原文:http://snowolf.iteye.com/blog/642492 JavaEye的朋友跟我说:“你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读”.ok,面向读者需求,我做调整,这里单说ZIP解压缩! 解压缩与压缩运作方式相反,原理大抵相同,由ZipInputStream通过read方法对数据解压,同时需要通过CheckedInputStream设置冗余校验码,如: Java代码   CheckedInputStream cis = new Checked

Java后端实现图片压缩技术

今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者app,再调用接口的时候肯定会多多少少的浏览图片,尤其是脱离wifi的情况下,可以看到很多软件展示都会展示小图,这个小图就是压缩的图片,点击后才会放大,如下: 这样的做法可以尽量减少手机端的图片展示压力,因为一个图片对于上传者来说可能是几百K,也有可能是几兆,这样对于手机端无遗展现的压力会比较大,同

Java解压缩技术(一)ZIP压缩-解压缩

Java解压缩技术的实现 GZIP ZIP BZIP2系列实现 没啥好说的,都是些文件操作,直接贴代码 package com.ljh.zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import j

Java解压缩技术(二)GZIP压缩-解压缩(

Java解压缩技术的实现 GZIP ZIP BZIP2 没啥好说的,都是些文件IO操作 package com.ljh.gzip; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExcept

Java解压缩技术(三)BZIP2压缩-解压缩

Java解压缩技术的实现 GZIP ZIP BZIP2 与GZIP  ZIP 不同的是BZIP2在Java中没有实现,BZIP2的实现是Apache提供的Commons-Compress.jar来实现的 关于 Commons Compress请移步:http://commons.apache.org/proper/commons-compress/ 还是直接上代码 package com.ljh.bzip2; import java.io.ByteArrayInputStream; import

(转)java缓存技术,记录

http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/articles/cache-static-files-with-jnotify-and-ehcache 介绍 JNotify:http://jnotify.sourceforge.net/,通过JNI

JAVA缓存技术

最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/articles/cache-static-files-with-jnotify-and-ehcache 介绍 JNotify:http://jnotify.sourceforge.net/,通过JNI技术,让Java代码可以实时的监控制定文件夹内文件的变动信息,支持Linux/Windows/MacO