服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在java中操作zip文件,压缩/解压


  可随意转载,但请注明出处及作者
sonymusic
2003.05.28
==========================================================================
在java中操作zip文件,压缩/解压


package test.nothing;

import java.io.*;
import java.util.*;
import java.util.zip.*;

import com.beaconsystem.util.*;

import junit.framework.testcase;

/**
* @author sonymusic
*
* 用于测试java.util.zip包压缩和解压缩文件zip文件的例子.
* 基于junit编写,包括两个test方法,和三个辅助方法.
* 注意到使用过程中操作的全是流,所以不仅仅可以读写文件。这只是一个简单的例子.
*/
public class testzipop extends testcase {

/**
* constructor for testzipop.
* @param arg0
*/
public testzipop(string arg0) {
super(arg0);
}

public static void main(string[] args) {
junit.textui.testrunner.run(testzipop.class);
}

/**
* zip压缩功能测试.
* 将d://temp//zipout目录下的所有文件连同子目录压缩到d://temp//out.zip.
* @throws exception
*/
public void testcreatezip() throws exception{
//压缩basedir下所有文件,包括子目录
string basedir="d://temp//zipout";
list filelist=getsubfiles(new file(basedir));

//压缩文件名
zipoutputstream zos=new zipoutputstream(new fileoutputstream("d://temp//out.zip"));

zipentry ze=null;
byte[] buf=new byte[1024];
int readlen=0;
for (int i = 0; i <filelist.size(); i++) {
file f=(file)filelist.get(i);
system.out.print("adding: "+f.getpath()+f.getname());

//创建一个zipentry,并设置name和其它的一些属性
ze=new zipentry(getabsfilename(basedir, f));
ze.setsize(f.length());
ze.settime(f.lastmodified());

//将zipentry加到zos中,再写入实际的文件内容
zos.putnextentry(ze);
inputstream is=new bufferedinputstream(new fileinputstream(f));
while ((readlen=is.read(buf, 0, 1024))!=-1) {
zos.write(buf, 0, readlen);
}
is.close();
system.out.println("   done...");
}
zos.close();
}

/**
* 测试解压缩功能.
* 将d://download//test.zip文件解压到d://temp//zipout目录下.
* @throws exception
*/
public void testreadzip() throws exception{
//inputstream is=new bufferedinputstream(new fileinputstream());
string basedir="d://temp//zipout";
zipfile zfile=new zipfile("d://download//test.zip");
system.out.println(zfile.getname());
enumeration zlist=zfile.entries();
zipentry ze=null;
byte[] buf=new byte[1024];
while(zlist.hasmoreelements()){
//从zipfile中得到一个zipentry
ze=(zipentry)zlist.nextelement();
if(ze.isdirectory()){
system.out.println("dir: "+ze.getname()+" skipped..");
continue;
}
system.out.println("extracting: "+ze.getname()+"/t"+ze.getsize()+"/t"+ze.getcompressedsize());

//以zipentry为参数得到一个inputstream,并写到outputstream中
outputstream os=new bufferedoutputstream(new fileoutputstream(getrealfilename(basedir, ze.getname())));
inputstream is=new bufferedinputstream(zfile.getinputstream(ze));
int readlen=0;
while ((readlen=is.read(buf, 0, 1024))!=-1) {
os.write(buf, 0, readlen);
}
is.close();
os.close();
system.out.println("extracted: "+ze.getname());
}
zfile.close();
}

/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
* @param basedir 指定根目录
* @param absfilename 相对路径名,来自于zipentry中的name
* @return java.io.file 实际的文件
*/
private file getrealfilename(string basedir, string absfilename){
string[] dirs=regex.split("/", absfilename);
//system.out.println(dirs.length);
file ret=new file(basedir);
if(dirs.length>1){
for (int i = 0; i <dirs.length-1; i++) {
ret=new file(ret, dirs[i]);
}
}
if(!ret.exists()){
ret.mkdirs();
}
ret=new file(ret, dirs[dirs.length-1]);
return ret;
}

/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
* @param basedir java.lang.string 根目录
* @param realfilename java.io.file 实际的文件名
* @return 相对文件名
*/
private string getabsfilename(string basedir, file realfilename){
file real=realfilename;
file base=new file(basedir);
string ret=real.getname();
while (true) {
real=real.getparentfile();
if(real==null) break;
if(real.equals(base)) break;
else{
ret=real.getname()+"/"+ret;
}
}
return ret;
}

/**
* 取得指定目录下的所有文件列表,包括子目录.
* @param basedir file 指定的目录
* @return 包含java.io.file的list
*/
private list getsubfiles(file basedir){
list ret=new arraylist();
//file base=new file(basedir);
file[] tmp=basedir.listfiles();
for (int i = 0; i <tmp.length; i++) {
if(tmp[i].isfile()){
ret.add(tmp[i]);
}
if(tmp[i].isdirectory()){
ret.addall(getsubfiles(tmp[i]));
}
}
return ret;
}

}

扫描关注微信公众号