| |
宋 现 锋 中科院 地理所
--------------------------------------------------------------------------------
简 介 由 于 网 络 带 宽 是 有 限 的, 所 以 数 据 文 件 的 压 缩 有 利 于 数 据 在internet 上 的 快 速 传 输, 同 时 也 节 省 服 务 器 的 外 存 空 间。
java 实 现 了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+""; else doc=doc+" "; } doczipsize = 0; showtextandinfo(); }
private void openfile() {//打开zip文件,将文件内容读入doc字符串变量中。 filedialog dlg=new filedialog(this,"open",filedialog.load); 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("uncompessed size: "+doc.length() +" compressed size: "+doczipsize); }
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!");} } }
|
|