网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  在java中操作zip文件,压缩/解压     
  文章作者:未知  文章来源:水木森林  
  查看:59次  录入:管理员--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的搜索结果
  相关文档
java基础入门学习——事件模型(组图) 11-17
编程需要注意的陷阱:java继承是有害的 11-16
java线程控制的图像分割与合成 11-16
java开源缓存系统的介绍 11-17
优化java applets 加载过程 11-17
servlet规范定义的servlet 生命周期 11-17
怎样在java文件中获取该项目的相对路径 11-16
java web services 网络服务的三个标准 11-16
j2ee配置指南 11-16
weblogic ejb 学习笔记(2) 11-17
struts 的优点及其在 apusic 上的安装 11-17
在struts 2中实现文件上传 11-17
你可以在oracle中发布java程序吗? 11-17
robbin 的 httpsession 总结 11-17
java中的抽象数据类型探讨 11-16
怎样在applet中发email 11-17
nutch在windows中安装之细解 11-17
chinaitlab的scjp远程培训内容归纳 11-17
使用java编写nt服务程序 11-17
经典java开发工具介绍(4):borland jbuilder 4 enterprise 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息