网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  在java中操作zip文件,压缩/解压     
  文章作者:未知  文章来源:水木森林  
  查看:63次  录入:管理员--2007-11-17  
 
  可随意转载,但请注明出处及作者
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;
}

}
 
 
上一篇: 在java应用程序中如何实现ftp的功能 (转)    下一篇: 在java中检索google的搜索结果
  相关文档
利用httpsessionlistener统计在线人数 11-17
java设计模式和软件工程之designpattern介绍 11-17
java 数据对象(jdo)介绍(一) 11-17
j2ee 探险者:持久数据管理 11-17
java中 中文问题详解 11-17
浅析spring2.0中新的bean类型实现原理 01-10
tomcat和mysql的一个server.xml 11-17
制作可执行jar 11-17
基于jdk5.0一些collection类的使用总结 01-21
共享有限的资源 11-17
scriptenginebuildversion 函数 11-16
如果我是国王:关于解决 java 编程语言线程问题的建议 11-17
数据操作相关函数笔记 11-17
接收网络服务器发送来的数据 11-17
技术分享 如何实现基于j2ee的服务(图) 11-17
rose 技术白皮书 11-17
java开发精彩教程:jsf系列(三) 11-16
为 web 服务构建 struts 应用程序 11-17
jbuilder class文件的 module引用 11-17
zeus实现xml-java的数据绑定 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息