使用java.util.zip对字符串进行压缩和解压缩

来源:互联网 发布:to:day软件 编辑:程序博客网 时间:2024/04/30 16:39
原文出处: 使用java.util.zip对字符串进行压缩和解压缩
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

查阅了下资料,总结下面的代码:

  1. /**
  2. * 压缩字符串为 byte[]
  3. * 储存可以使用new sun.misc.BASE64Encoder().encodeBuffer(byte[] b)方法
  4. * 保存为字符串
  5. *
  6. * @param str 压缩前的文本
  7. * @return
  8. */
  9. public staticfinal byte[]compress(Stringstr){
  10. if(str ==null)
  11. return null;
  12.  
  13. byte[] compressed;
  14. ByteArrayOutputStream out =null;
  15. ZipOutputStream zout =null;
  16.  
  17. try {
  18. out = new ByteArrayOutputStream();
  19. zout = new ZipOutputStream(out);
  20. zout.putNextEntry(new ZipEntry("0"));
  21. zout.write(str.getBytes());
  22. zout.closeEntry();
  23. compressed = out.toByteArray();
  24. } catch(IOExceptione){
  25. compressed = null;
  26. } finally{
  27. if(zout !=null) {
  28. try{zout.close();} catch(IOExceptione){}
  29. }
  30. if(out !=null) {
  31. try{out.close();} catch(IOExceptione){}
  32. }
  33. }
  34.  
  35. return compressed;
  36. }
  37.  
  38. /**
  39. * 将压缩后的 byte[] 数据解压缩
  40. *
  41. * @param compressed 压缩后的 byte[] 数据
  42. * @return 解压后的字符串
  43. */
  44. public staticfinal Stringdecompress(byte[]compressed){
  45. if(compressed ==null)
  46. return null;
  47.  
  48. ByteArrayOutputStream out =null;
  49. ByteArrayInputStream in =null;
  50. ZipInputStream zin =null;
  51. String decompressed;
  52. try {
  53. out = new ByteArrayOutputStream();
  54. in = new ByteArrayInputStream(compressed);
  55. zin = new ZipInputStream(in);
  56. ZipEntry entry =zin.getNextEntry();
  57. byte[]buffer = newbyte[1024];
  58. int offset = -1;
  59. while((offset =zin.read(buffer)) != -1) {
  60. out.write(buffer,0, offset);
  61. }
  62. decompressed = out.toString();
  63. } catch(IOExceptione){
  64. decompressed = null;
  65. } finally{
  66. if(zin !=null) {
  67. try {zin.close();}catch(IOExceptione){}
  68. }
  69. if(in !=null) {
  70. try {in.close();}catch(IOExceptione){}
  71. }
  72. if(out !=null) {
  73. try {out.close();}catch(IOExceptione){}
  74. }
  75. }
  76.  
  77. return decompressed;
  78. }

这里需要特别注意的是,如果你想把压缩后的byte[]保存到字符串中,不能直接使用new String(byte)或者byte.toString(),因为这样转换之后容量是增加的。同样的道理,如果是字符串的话,也不能直接使用new String().getBytes()获取byte[]传入到decompress中进行解压缩。
  如果保存压缩后的二进制,可以使用new sun.misc.BASE64Encoder().encodeBuffer(byte[] b)将其转换为字符串。同样解压缩的时候首先使用new BASE64Decoder().decodeBuffer 方法将字符串转换为字节,然后解压就可以了。
  
关于使用 java.util.zip 操作文件和目录,请参考这里:http://www.baidu.com/s?wd=java.util.zip&cl=3

参考资料:
Simple String Compression Functions
http://forum.java.sun.com/thread.jspa?threadID=250124&start=15&tstart=0
使用cookie定制用户UI
http://www.phpx.com/happy/thread-113016-1-24.html

 

原创粉丝点击