JAVA下的GZIP应用

gzip是目前广泛应用的一种压缩方式,它具有很高的压缩比和压缩效率.在sun公司发布的jdk中包含了java.util.zip包,对gzip提供了直接支持.使用java语言可以很方便的实现gzip压缩和解压缩.以下是一个压缩和解压缩的最简程序. 
(压缩:gzip.java) 
java 代码
 
  1. import java.io.*;   
  2. import java.util.zip.*;   
  3.   
  4. public class gzip   
  5. {   
  6. public static void main(String[] args)   
  7. {   
  8. if (args.length !=2)   
  9. {   
  10. System.out.println("Usage:java gzip ");   
  11. System.exit(1);   
  12. }   
  13. try   
  14. {   
  15. //打开需压缩文件作为文件输入流   
  16. FileInputStream fin=new FileInputStream(args[0]);   
  17. //建立压缩文件输出流   
  18. FileOutputStream fout=new FileOutputStream(args[1]);   
  19. //建立gzip压缩输出流   
  20. GZIPOutputStream gzout=new GZIPOutputStream(fout);   
  21. byte[] buf=new byte[1024];//设定读入缓冲区尺寸   
  22. int num;   
  23.   
  24. while ((num=fin.read(buf)) != -1)   
  25. {   
  26. gzout.write(buf,0,num);   
  27. }   
  28. gzout.close();//!!!关闭流,必须关闭所有输入输出流.保证输入输出完整和释放系统资源.   
  29. fout.close();   
  30. fin.close();   
  31. }catch(IOException e)   
  32. {   
  33. System.out.println(e);   
  34. }   
  35. }   
  36. }    

(解压缩:unzip.java) 
java 代码
 
  1. import java.io.*;   
  2. import java.util.zip.*;   
  3.   
  4. public class ungzip   
  5. {   
  6. public static void main(String[] args)   
  7. {   
  8. if (args.length !=2)   
  9. {   
  10. System.out.println("Usage:java ungzip ");   
  11. System.exit(1);   
  12. }   
  13. try   
  14. {   
  15. //建立gzip压缩文件输入流   
  16. FileInputStream fin=new FileInputStream(args[0]);   
  17. //建立gzip解压工作流   
  18. GZIPInputStream gzin=new GZIPInputStream(fin);   
  19. //建立解压文件输出流   
  20. FileOutputStream fout=new FileOutputStream(args[1]);   
  21. byte[] buf=new byte[1024];   
  22. int num;   
  23.   
  24. while ((num=gzin.read(buf,0,buf.length)) != -1)   
  25. {   
  26. fout.write(buf,0,num);   
  27. }   
  28. gzin.close();   
  29. fout.close();   
  30. fin.close();   
  31. }catch(IOException e)   
  32. {   
  33. System.out.println(e);   
  34. }   
  35. }   
  36. }    

非面向对象语言要实现保存工作数据(如一个绘图程序保存一幅画面的定义),往往需要一个程序数据格式转换为外部 
文件格式存储,工作时再反向转换的过程.实现比较麻烦,编程不透明.而java语言是一种面向对象的语言,使用它的对象序 
列化特性,就可实现将工作对象(画面定义对象数据)直接写入硬盘,需要时再直接再读入内存,不需任何额外操作.实现非常 
方便.但由于写出对象为java类格式,因此数据冗余度较大.当数据量很大时,往往造成存储文件很大.过多的磁盘操作也导致 
数据读入花费了更多时间,占有了大量内存.采用gzip压缩存储对象是解决此类问题的有效手段.(在本人实现的一个监控系 
统中,调入一幅测试画面(10万个组件,压缩前7M,压缩后600K),压缩前对如画面后内存为26M,压缩后读入内存为12M,读入速 
度也大幅提高.效果十分明显). 
java程序开发网络应用程序是它的最大优势,但在某些低速网络情况下(Internet、拨号网络).网络往往造成传输瓶颈, 
影响应用效果,对于实时性要求高的应用影响更大.采用压缩可以有效改善通信效果. 
可见,在java下的对象gzip压缩有着广泛的应用价值.以下是一个简单事例程序. 
(串行化的数据对象文件:Data.java) 
java 代码
 
  1. import java.io.*;   
  2. import java.util.zip.*;   
  3. public class Data implements Serializable//继承串行序列化接口   
  4. {   
  5. String name="匹配";   
  6. int age=123;   
  7. float height=1.902f;   
  8. }   
  9. (对象压缩解压缩类文件:compressObject.java)   
  10. import java.util.zip.*;   
  11. import java.io.*;   
  12. public final class compressObject   
  13. {   
  14. //将Data类型数据对象序列化对象压缩,返回字节数组,压缩后的对象数组可写入文件保存或用于网络传输   
  15. public static byte[] writeCompressObject(Data object_)   
  16. {   
  17. byte[] data_=null;   
  18. try   
  19. {   
  20. //建立字节数组输出流   
  21. ByteArrayOutputStream o = new ByteArrayOutputStream();   
  22. //建立gzip压缩输出流   
  23. GZIPOutputStream gzout=new GZIPOutputStream(o);   
  24. //建立对象序列化输出流   
  25. ObjectOutputStream out = new ObjectOutputStream(gzout);   
  26. out.writeObject(object_);   
  27. out.flush();   
  28. out.close();   
  29. gzout.close();   
  30. //返回压缩字节流   
  31. data_=o.toByteArray();   
  32. o.close();   
  33. }catch(IOException e)   
  34. {   
  35. System.out.println(e);   
  36. }   
  37. return(data_);   
  38. }   
  39. //将压缩字节数组还原为Data类型数据对象   
  40. public static Data readCompressObject(byte[] data_)   
  41. {   
  42. Data object_=null;   
  43. try   
  44. {   
  45. //建立字节数组输入流   
  46. ByteArrayInputStream i = new ByteArrayInputStream(data_);   
  47. //建立gzip解压输入流   
  48. GZIPInputStream gzin=new GZIPInputStream(i);   
  49. //建立对象序列化输入流   
  50. ObjectInputStream in = new ObjectInputStream(gzin);   
  51. //按制定类型还原对象   
  52. object_=(Data)in.readObject();   
  53. i.close();   
  54. gzin.close();   
  55. in.close();   
  56. }catch(ClassNotFoundException e)   
  57. {   
  58. System.out.println(e);   
  59. }catch(IOException e)   
  60. {   
  61. System.out.println(e);   
  62. }   
  63. return(object_);   
  64. }   
  65. }    

(主程序:test.java) 
java 代码
 
  1. import java.io.*;   
  2. import java.util.zip.*;   
  3.   
  4. public class test   
  5. {   
  6. public static void main(String[] args)   
  7. {   
  8. Data testData_=new Data();   
  9. //未压缩数据对象内容   
  10. System.out.println("name="+testData_.name+" age="+testData_.age+" height="+testData_.height);   
  11. //压缩   
  12. byte[] i_=compressObject.writeCompressObject(testData_);   
  13.   
  14. /*  
  15. 可执行保存或网络传输,需要时还原或在对端还原  
  16. */   
  17.   
  18. //解压缩   
  19. Data o_=compressObject.readCompressObject(i_);   
  20. //解压缩后对象内容   
  21. System.out.println("name="+o_.name+" age="+o_.age+" height="+o_.height);   
  22. }   
  23. }    

以上只是java下应用gzip压缩的一个简单例子,请大家举一反三在自己的开发中使用.由于本人水平所限,不当之处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值