java算法实现压缩及解压缩.docx
- 文档编号:2243954
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:7
- 大小:17.30KB
java算法实现压缩及解压缩.docx
《java算法实现压缩及解压缩.docx》由会员分享,可在线阅读,更多相关《java算法实现压缩及解压缩.docx(7页珍藏版)》请在冰豆网上搜索。
java算法实现压缩及解压缩
java算法实现压缩及解压缩
importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;
importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.util.zip.ZipEntry;importjava.util.zip.ZipOutputStream;publicclaZip{
taticfinalintBUFFER=2048;publictaticvoidmain(Stringargv[]){try{
BufferedInputStreamorigin=null;
FileOutputStreamdet=newFileOutputStream(\ZipOutputStreamout=newZipOutputStream(newBufferedOutputStream(det));
bytedata[]=newbyte[BUFFER];Filef=newFile(\Filefile[]=f.litFile();for(inti=0;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.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;
importjava.io.FileOutputStream;importjava.util.Enumeration;
importjava.util.zip.ZipEntry;importjava.util.zip.ZipFile;publicclaUnZip{
taticfinalintBUFFER=2048;publictaticvoidmain(Stringargv[]){try{
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);intcount;
bytedata[]=newbyte[BUFFER];
while((count=bi.read(data,0,BUFFER))!
=-1){
bo.write(data,0,count);}
bo.fluh();bo.cloe();bi.cloe();}
zipFile.cloe();}catch(E某ceptione){e.printStackTrace();
}}}
由于网络带宽有限,所以数据文件的压缩有利于数据在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文件中。
FileDialogdlg=newFileDialog(thi,\dlg.how();
Stringfilename=dlg.getDirectory()+dlg.getFile();try{
∥创建一个文件实例
Filef=newFile(filename);
if(!
f.e某it())return;∥文件不存在,则返回∥用文件输出流构建ZIP压缩输出流
ZipOutputStreamzipo=newZipOutputStream(newFileOutputStream(f));zipo.etMethod(ZipOutp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 算法 实现 压缩 解压缩