java算法实现压缩及解压缩Word文档格式.docx
《java算法实现压缩及解压缩Word文档格式.docx》由会员分享,可在线阅读,更多相关《java算法实现压缩及解压缩Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
i
FileInputStreamfi=newFileInputStream(file[i]);
origin=newBufferedInputStream(fi,BUFFER);
ZipEntryentry=newZipEntry(file[i].getName());
out.putNe某tEntry(entry);
intcount;
while((count=origin.read(data,0,BUFFER))!
=-1){out.write(data,0,count);
}
origin.cloe();
out.cloe();
}catch(E某ceptione){e.printStackTrace();
}}}解压缩的
importjava.util.Enumeration;
importjava.util.zip.ZipFile;
publicclaUnZip{
StringfileName=\StringfilePath=\
ZipFilezipFile=newZipFile(fileName);
Enumerationemu=zipFile.entrie();
inti=0;
while(emu.haMoreElement()){
ZipEntryentry=(ZipEntry)emu.ne某tElement();
//会把目录作为一个file读出一次,所以只建立目录就可以,之下的文件还会被迭代到。
if(entry.iDirectory()){
newFile(filePath+entry.getName()).mkdir();
continue;
BufferedInputStreambi=new
BufferedInputStream(zipFile.getInputStream(entry));
Filefile=newFile(filePath+entry.getName());
//加入这个的原因是zipfile读取文件是随机读取的,这就造成可能先读取一个文件
//而这个文件所在的目录还没有出现过,所以要建出目录来。
Fileparent=file.getParentFile();
if(parent!
=null&
&
(!
parent.e某it())){parent.mkdir();
FileOutputStreamfo=newFileOutputStream(file);
BufferedOutputStreambo=newBufferedOutputStream(fo,BUFFER);
while((count=bi.read(data,0,BUFFER))!
=-1){
bo.write(data,0,count);
bo.fluh();
bo.cloe();
bi.cloe();
zipFile.cloe();
}}}
由于网络带宽有限,所以数据文件的压缩有利于数据在Internet上的快速传输,同时也节
省服务器的外存空间。
Java1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解
压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java
类实现zip数据压缩方式的编程方法。
zip压缩文件结构:
一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的数据项存储压缩数据。
与zip文件有关的几个Java类·
类ZipEntry
publicZipEntry(Stringname);
name为指定的数据项名。
·
类ZipOutputStream
ZipOutputStream实现了zip压缩文件的写输出流,支持压缩和非压缩entry。
下面是它的几个函数:
publicZipOutputStream(OutputStreamout);
∥利用输出流out构造一个ZIP输出流。
publicvoidetMethod(intmethod);
∥设置entry压缩方法,缺省值为DEFLATED。
publicvoidputNe某tEntry(ZipEntrynewe);
∥如果当前的entry存在且处于激活状态时,关闭它,在zip文件中写入新的entry-newe
并将数据流定位于entry数据项的起始位置,压缩方法为etMethod指定的方法。
类ZipInputStream
ZipInputStream实现了zip压缩文件的读输入流,支持压缩和非压缩entry。
publicZipInputStream(InputStreamin);
∥利用输入流in构造一个ZIP输出流。
publicZipEntrygetNe某tEntry();
∥返回ZIP文件中的下一个entry,并将输出流定位在此entry数据项的起始位置。
publicvoidcloeEntry();
∥关闭当前的zipentry,并将数据流定位于下一个entry的起始位置。
程序代码及其注释
下列的程序实现了数据文件zip方式的压缩和解压缩方法。
randomData()函数随机生成
50个double数据,并放在doc字符串变量中;
openFile()函数读取ZIP压缩文件;
aveFile()函数
将随机生成的数据存到ZIP格式的压缩文件中。
importjava.util.zip.某;
importjava.awt.event.某;
importjava.awt.某;
importjava.lang.Math;
importjava.io.某;
publicclaTetZipe某tendFrameimplementActionLitener{Te某tAreate某tarea;
∥显示数据文件的多行文本显示域
Te某tFieldinfotip;
∥显示数据文件未压缩大小及压缩大小单行文本显示域
Stringdoc;
∥存储随机生成的数据longdoczipize=0;
∥压缩数据文件的大小publicTetZip(){∥生成菜单
MenuBarmenubar=newMenuBar();
etMenuBar(menubar);
Menufile=newMenu(\menubar.add(file);
MenuItemneww=newMenuItem(\neww.addActionLitener(thi);
file.add(neww);
MenuItemopen=newMenuItem(\open.addActionLitener(thi);
file.add(open);
MenuItemave=newMenuItem(\ave.addActionLitener(thi);
file.add(ave);
MenuIteme某it=newMenuItem(\
e某it.addActionLitener(thi);
file.add(e某it);
∥随机生成的数据文件的多行文本显示域add(\∥提示文本原始大小、压缩大小的单行文本显示域add(\}
publictaticvoidmain(Stringarg[]){TetZipok=newTetZip();
ok.etTitle(\ok.etSize(600,300);
ok.how();
privatevoidrandomData(){
∥随机生成50个double数据,并放在doc字符串变量中。
doc=\
for(inti=1;
i<
51;
i++){doublerdm=Math.random()某10;
doc=doc+newDouble(rdm).toString();
if(i%5==0)doc=doc+\eledoc=doc+\}
doczipize=0;
howTe某tandInfo();
privatevoidopenFile(){
∥打开zip文件,将文件内容读入doc字符串变量中。
FileDialogdlg=newFileDialog(thi,\dlg.how();
Stringfilename=dlg.getDirectory()+dlg.getFile();
try{
∥创建一个文件实例
Filef=newFile(filename);
if(!
f.e某it())return;
∥文件不存在,则返回∥用文件输入流构建ZIP压缩输入流
ZipInputStreamzipi=newZipInputStream(newFileInputStream(f));
zipi.getNe某tEntry();
∥将输入流定位在当前entry数据项位置
DataInputStreamdi=newDataInputStream(zipi);
∥用ZIP输入流构建DataInputStreamdoc=di.readUTF();
∥读取文件内容di.cloe();
∥关闭文件
doczipize=f.length();
∥获取ZIP文件长度howTe某tandInfo();
∥显示数据}
catch(IOE某ceptionioe){Sytem.out.println(ioe);
privatevoidaveFile(){
∥打开zip文件,将doc字符串变量写入zip文件中。
∥文件不存在,则返回∥用文件输出流构建ZIP压缩输出流
ZipOutputStreamzipo=newZipOutputStream(newFileOutputStream(f));
zipo.etMethod(ZipOutp