利用java实现zip的压缩和解压

利用java实现zip压缩/解压缩


java 1.1实现了i/o数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解 


压缩的实现比较容易,下面介绍利用zipentry、zipinputstream和zipoutputstream三个java 


类实现zip数据压缩方式的编程方法。 


  zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的 


数据项存储压缩数据。 


  与zip文件有关的几个java类 


  ·类zipentry 


  public zipentry(string name); 


  name为指定的数据项名。 


  ·类zipoutputstream 


  zipoutputstream实现了zip压缩文件的写输出流,支持压缩和非压缩entry。下面是它的 


几个函数: 


  public zipoutputstream(outputstream out); 


  ∥利用输出流out构造一个zip输出流。 


  public void setmethod(int method); 


  ∥设置entry压缩方法,缺省值为deflated。 


  public void putnextentry(zipentry newe); 


  ∥如果当前的entry存在且处于激活状态时,关闭它,在zip文件中写入新的entry-newe 


并将数据流定位于entry数据项的起始位置,压缩方法为setmethod指定的方法。 


  ·类zipinputstream 


  zipinputstream实现了zip压缩文件的读输入流,支持压缩和非压缩entry。下面是它的 


几个函数: 


  public zipinputstream(inputstream in); 


  ∥利用输入流in构造一个zip输出流。 


  public zipentry getnextentry(); 


  ∥返回zip文件中的下一个entry,并将输出流定位在此entry数据项的起始位置。 


  public void closeentry(); 


  ∥关闭当前的zip entry,并将数据流定位于下一个entry的起始位置。 


  程序代码及其注释 


  下列的程序实现了数据文件zip方式的压缩和解压缩方法。randomdata()函数随机生成 


50个double数据,并放在doc字符串变量中;openfile()函数读取zip压缩文件;savefile()函数 


将随机生成的数据存到zip格式的压缩文件中。 


  import java.util.zip.*; 


  import java.awt.event.*; 


  import java.awt.*; 


  import java.lang.math; 


  import java.io.*; 


  public class testzip extends frame implements actionlistener { 


  textarea textarea; ∥显示数据文件的多行文本显示域 


  textfield infotip; ∥显示数据文件未压缩大小及压缩大小单行文本显示域 


  string doc; ∥存储随机生成的数据 


  long doczipsize = 0;∥压缩数据文件的大小 


  public testzip(){ 


  ∥生成菜单 


  menubar menubar = new menubar(); 


  setmenubar(menubar); 


  menu file = new menu("file",true); 


  menubar.add(file); 


  menuitem neww= new menuitem("new"); 


  neww.addactionlistener(this); 


  file.add(neww); 


  menuitem open=new menuitem("open"); 


  open.addactionlistener(this); 


  file.add(open); 


  menuitem save=new menuitem("save"); 


  save.addactionlistener(this); 


  file.add(save); 


  menuitem exit=new menuitem("exit"); 


  exit.addactionlistener(this); 


  file.add(exit); 


  ∥随机生成的数据文件的多行文本显示域 


  add("center",textarea = new textarea()); 


  ∥提示文本原始大小、压缩大小的单行文本显示域 


  add("south",infotip = new textfield()); 


  } 


  public static void main(string args[]){ 


  testzip ok=new testzip(); 


  ok.settitle("zip sample"); 


  ok.setsize(600,300); 


  ok.show(); 


  } 


  private void randomdata(){ 


  ∥随机生成50个double数据,并放在doc字符串变量中。 


  doc=""; 


  for(int i=1;i<51;i++){ 


   double rdm=math.random()*10; 


   doc=doc+new double(rdm).tostring(); 


   if(i%5 == 0) doc=doc+"\n"; 


   else doc=doc+" "; 


  } 


  doczipsize = 0; 


  showtextandinfo(); 


  } 


  private void openfile(){ 


  ∥打开zip文件,将文件内容读入doc字符串变量中。 


  filedialog dlg=new filedialog(this,"open",filedialog.loa d); 


  dlg.show(); 


  string filename=dlg.getdirectory()+dlg.getfile(); 


  try{ 


  ∥创建一个文件实例 


  file f=new file(filename); 


  if(!f.exists()) return; ∥文件不存在,则返回 


  ∥用文件输入流构建zip压缩输入流 


  zipinputstream zipis=new zipinputstream(new fileinputstream(f)); 


  zipis.getnextentry(); 


  ∥将输入流定位在当前entry数据项位置 


  datainputstream dis=new datainputstream(zipis); 


  ∥用zip输入流构建datainputstream 


  doc=dis.readutf();∥读取文件内容 


  dis.close();∥关闭文件 


  doczipsize = f.length();∥获取zip文件长度 


  showtextandinfo();∥显示数据 


  } 


  catch(ioexception ioe){ 


  system.out.println(ioe); 


  } 


  } 


  private void savefile(){ 


  ∥打开zip文件,将doc字符串变量写入zip文件中。 


  filedialog dlg=new filedialog(this,"save",filedialog.save); 


  dlg.show(); 


  string filename=dlg.getdirectory()+dlg.getfile(); 


  try{ 


  ∥创建一个文件实例 


  file f=new file(filename); 


  if(!f.exists()) return; ∥文件不存在,则返回 


  ∥用文件输出流构建zip压缩输出流 


  zipoutputstream zipos=new zipoutputstream(new fileoutputstream(f)); 


  zipos.setmethod(zipoutputstream.deflated); ∥设置压缩方法 


  zipos.putnextentry(new zipentry("zip")); 


  ∥生成一个zip entry,写入文件输出流中,并将输出流定位于entry起始处。 


  dataoutputstream os=new dataoutputstream(zipos); 


  ∥用zip输出流构建dataoutputstream; 


  os.writeutf(doc);∥将随机生成的数据写入文件中 


  os.close();∥关闭数据流 


  doczipsize = f.length(); 


  ∥获取压缩文件的长度 


  showtextandinfo();∥显示数据 


  } 


  catch(ioexception ioe){ 


  system.out.println(ioe); 


  } 


  } 


  private void showtextandinfo(){ 


  ∥显示数据文件和压缩信息 


  textarea.replacerange(doc,0,textarea.gettext().length()); 


  infotip.settext("uncompressed size: "+doc.length()+"compressed size: "+dc zipsize); 


  } 


  public void actionperformed(actionevent e){ 


  string arg = e.getactioncommand(); 


  if ("new".equals(arg)) randomdata(); 


  else if ("open".equals(arg)) openfile(); 


  else if ("save".equals(arg)) savefile(); 


  else if ("exit".equals(arg)){ 


   dispose();∥关闭窗口 


   system.exit(0);∥关闭程序 


  } 


  else { 


   system.out.println("no this command!"); 


  } 


  } 


  } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值