`
xcy13638760
  • 浏览: 51496 次
社区版块
存档分类
最新评论

Java压缩技术(一) ZLib

 
阅读更多
应好友需要,整理一下Java的压缩算法,先从ZLib开始。

相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现

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

压缩工具代码如下:
Java代码收藏代码
  1. /**
  2. *2009-9-9
  3. */
  4. packageorg.zlex.commons.io;
  5. importjava.io.ByteArrayOutputStream;
  6. importjava.io.IOException;
  7. importjava.io.InputStream;
  8. importjava.io.OutputStream;
  9. importjava.util.zip.Deflater;
  10. importjava.util.zip.DeflaterOutputStream;
  11. importjava.util.zip.Inflater;
  12. importjava.util.zip.InflaterInputStream;
  13. /**
  14. *ZLib压缩工具
  15. *
  16. *@author<ahref="mailto:zlex.dongliang@gmail.com">梁栋</a>
  17. *@version1.0
  18. *@since1.0
  19. */
  20. publicabstractclassZLibUtils{
  21. /**
  22. *压缩
  23. *
  24. *@paramdata
  25. *待压缩数据
  26. *@returnbyte[]压缩后的数据
  27. */
  28. publicstaticbyte[]compress(byte[]data){
  29. byte[]output=newbyte[0];
  30. Deflatercompresser=newDeflater();
  31. compresser.reset();
  32. compresser.setInput(data);
  33. compresser.finish();
  34. ByteArrayOutputStreambos=newByteArrayOutputStream(data.length);
  35. try{
  36. byte[]buf=newbyte[1024];
  37. while(!compresser.finished()){
  38. inti=compresser.deflate(buf);
  39. bos.write(buf,0,i);
  40. }
  41. output=bos.toByteArray();
  42. }catch(Exceptione){
  43. output=data;
  44. e.printStackTrace();
  45. }finally{
  46. try{
  47. bos.close();
  48. }catch(IOExceptione){
  49. e.printStackTrace();
  50. }
  51. }
  52. compresser.end();
  53. returnoutput;
  54. }
  55. /**
  56. *压缩
  57. *
  58. *@paramdata
  59. *待压缩数据
  60. *
  61. *@paramos
  62. *输出流
  63. */
  64. publicstaticvoidcompress(byte[]data,OutputStreamos){
  65. DeflaterOutputStreamdos=newDeflaterOutputStream(os);
  66. try{
  67. dos.write(data,0,data.length);
  68. dos.finish();
  69. dos.flush();
  70. }catch(IOExceptione){
  71. e.printStackTrace();
  72. }
  73. }
  74. /**
  75. *解压缩
  76. *
  77. *@paramdata
  78. *待压缩的数据
  79. *@returnbyte[]解压缩后的数据
  80. */
  81. publicstaticbyte[]decompress(byte[]data){
  82. byte[]output=newbyte[0];
  83. Inflaterdecompresser=newInflater();
  84. decompresser.reset();
  85. decompresser.setInput(data);
  86. ByteArrayOutputStreamo=newByteArrayOutputStream(data.length);
  87. try{
  88. byte[]buf=newbyte[1024];
  89. while(!decompresser.finished()){
  90. inti=decompresser.inflate(buf);
  91. o.write(buf,0,i);
  92. }
  93. output=o.toByteArray();
  94. }catch(Exceptione){
  95. output=data;
  96. e.printStackTrace();
  97. }finally{
  98. try{
  99. o.close();
  100. }catch(IOExceptione){
  101. e.printStackTrace();
  102. }
  103. }
  104. decompresser.end();
  105. returnoutput;
  106. }
  107. /**
  108. *解压缩
  109. *
  110. *@paramis
  111. *输入流
  112. *@returnbyte[]解压缩后的数据
  113. */
  114. publicstaticbyte[]decompress(InputStreamis){
  115. InflaterInputStreamiis=newInflaterInputStream(is);
  116. ByteArrayOutputStreamo=newByteArrayOutputStream(1024);
  117. try{
  118. inti=1024;
  119. byte[]buf=newbyte[i];
  120. while((i=iis.read(buf,0,i))>0){
  121. o.write(buf,0,i);
  122. }
  123. }catch(IOExceptione){
  124. e.printStackTrace();
  125. }
  126. returno.toByteArray();
  127. }
  128. }

测试用例代码如下:
Java代码收藏代码
  1. /**
  2. *2009-9-9
  3. */
  4. packageorg.zlex.commons.io;
  5. importstaticorg.junit.Assert.*;
  6. importjava.io.File;
  7. importjava.io.FileInputStream;
  8. importjava.io.FileOutputStream;
  9. importorg.junit.Test;
  10. /**
  11. *ZLib压缩测试用例
  12. *
  13. *@author<ahref="mailto:zlex.dongliang@gmail.com">梁栋</a>
  14. *@version1.0
  15. *@since1.0
  16. */
  17. publicclassZLibUtilsTest{
  18. @Test
  19. publicfinalvoidtestBytes(){
  20. System.err.println("字节压缩/解压缩测试");
  21. StringinputStr="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. StringoutputStr=newString(output);
  30. System.err.println("输出字符串:\t"+outputStr);
  31. assertEquals(inputStr,outputStr);
  32. }
  33. @Test
  34. publicfinalvoidtestFile(){
  35. Stringfilename="zlib";
  36. Filefile=newFile(filename);
  37. System.err.println("文件压缩/解压缩测试");
  38. StringinputStr="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. FileOutputStreamfos=newFileOutputStream(file);
  44. ZLibUtils.compress(input,fos);
  45. fos.close();
  46. System.err.println("压缩后字节长度:\t"+file.length());
  47. }catch(Exceptione){
  48. fail(e.getMessage());
  49. }
  50. byte[]output=null;
  51. try{
  52. FileInputStreamfis=newFileInputStream(file);
  53. output=ZLibUtils.decompress(fis);
  54. fis.close();
  55. }catch(Exceptione){
  56. fail(e.getMessage());
  57. }
  58. System.err.println("解压缩后字节长度:\t"+output.length);
  59. StringoutputStr=newString(output);
  60. System.err.println("输出字符串:\t"+outputStr);
  61. assertEquals(inputStr,outputStr);
  62. }
  63. }

输入结果
Consloe代码收藏代码
  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压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现
分享到:
评论

相关推荐

    java解压zlib和压缩zlib的jar

    java解压zlib和压缩zlib的jar

    使用ZLIB库压缩解压源码(支持多级文件目录)

    ZLIB库是一个广泛使用的开源库,它提供了高效的无损数据压缩和解压缩功能。本篇文章将详细探讨如何使用ZLIB库来处理多级文件目录的压缩与解压,以及涉及到的相关源码知识。 首先,ZLIB库是基于DEFLATE算法实现的,...

    java zlib zip gzip

    Java中的Zlib、Zip和Gzip是三种广泛使用的数据压缩库和格式,它们在软件开发,尤其是处理数据传输和存储时扮演着重要角色。这里我们将深入探讨这些技术及其在Java环境中的应用。 **Zlib**: Zlib是一个开源的库,...

    java压缩字符串

    java压缩字符串

    java Zlib算法!!!!!

    java zlib压缩算法资源,懒的写了,看看多少字了

    C#、java 字符流跨平台数据解压缩

    由于项目需求,需要在C#中压缩,然后在java里解压缩,或者倒过来,在Java里压缩,C#里解压缩,以下代码经测试验证通过。 关键技术点和体会: 压缩的结果采用Base64编码,方便在Java端或者C#端打印出来调试,也方便...

    java压缩技术

    ZLib ZIP 压缩——Java 原生实现 ZIP 解压缩——Java 原生实现 GZIP——Java 原生实现 GZIP 相关——浏览器解析 BZIP2——Commons 实现 TAR——Commons 实现

    zlib压缩源码

    首先,我们来理解zlib的核心压缩技术。zlib库基于DEFLATE压缩算法,这是一种结合了LZ77(Lempel-Ziv)和霍夫曼编码(Huffman Coding)的混合压缩方法。LZ77用于寻找文本中的重复模式并创建长度-距离对,而霍夫曼编码...

    Java压缩技术整理

    输入结果 Consloe代码 1. 输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org 2. 输入字节长度: 59 3. 压缩后字节长度: 39 ...ZLib压缩对大字节数据压缩,才能反映出压缩效果。

    JAVA文件压缩与解压缩实践(源代码+论文)

    综上所述,"JAVA文件压缩与解压缩实践(源代码+论文)"这个资源提供了从理论到实践的全面学习材料,不仅包含了源代码示例,还有理论分析,对于想要深入了解和应用Java文件压缩技术的开发者来说,是一份宝贵的学习资料...

    zlib-1.1.4-1-src_zlib_zlib-1.1.4-1_

    【zlib-1.1.4-1-src_zlib_zlib-1.1.4-1_】这个压缩包文件包含的是zlib库的源代码版本1.1.4的一个构建,是软件开发中常用的一个压缩和解压缩库。zlib是一个开源、跨平台的库,主要用于数据压缩和解压缩,广泛应用于...

    zlib算法库,zlib算法库

    2. **软件开发**:许多编程语言的压缩库,如Python的`zlib`模块,Java的`java.util.zip`包,都是基于zlib实现的。 3. **文件格式**:如PNG图像文件格式就使用zlib进行数据压缩,以减小文件大小。 4. **游戏开发**...

    编译好的zlib库,可以直接使用

    Zlib库是一个开源的、跨平台的压缩和解压缩库,广泛应用于数据压缩,尤其是在网络传输和文件存储中。这个“编译好的zlib库,可以直接使用”是针对1.2.11版本的,这是一个稳定且广泛使用的版本,包含了各种优化和改进...

    J2ME环境下基于ZLIB的数据压缩与解压缩.pdf

    ### J2ME环境下基于ZLIB的数据压缩与解压缩——关键技术解析 #### 一、引言:J2ME与ZLIB的结合背景 J2ME(Java2 Micro Edition),由Sun Microsystems为嵌入式和消费类电子设备设计的开发平台,与J2SE和J2EE并列为...

    zlib的安装与使用

    3. **软件开发**:许多编程语言和框架(如Python、Java、.NET)内建了对zlib的支持,用于数据压缩和解压缩。 4. **图像和文档格式**:PNG图像格式和PDF文档格式都使用了zlib进行数据压缩。 总结,zlib是一个强大的...

    Java压缩PNG图像文件.rar

    总结来说,Java压缩PNG图像文件是一个涉及图像处理和压缩算法的复杂过程。开发者需要理解图像的内部结构,选择合适的压缩策略,并可能需要编写自定义的压缩代码以实现最佳的文件大小与质量平衡。对于J2ME游戏开发,...

    zlib源代码和rpm安装包

    zlib库不仅支持数据压缩,还提供了数据解压缩的功能,适用于多种编程语言,如C、C++、Java等。 **二、zlib的核心功能** 1. **数据压缩算法**:zlib采用了DEFLATE压缩算法,这是一种结合了LZ77滑动窗口压缩和霍夫曼...

    zlib-1.2.11.tar.gz

    zlib是一个开源的、跨平台的软件库,主要用于数据压缩和解压缩,广泛应用于网络传输、文件存储以及各种软件应用中。它的全名是zlib Compressed Data Library,版本1.2.11是其最新稳定版,提供了高效且灵活的数据压缩...

    zlib.dll插件

    zlib.dll是一个特别的DLL文件,它属于zlib库,一个广泛使用的开源数据压缩库。这篇文章将深入探讨zlib.dll的功能、用途以及与之相关的知识点。 **1. zlib库介绍** zlib是由Jean-loup Gailly和Mark Adler开发的,其...

Global site tag (gtag.js) - Google Analytics