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实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值