java实现可自己添加文件或文件夹的压缩(转)


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.Vector;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;


/**
* 压缩文件类,支持添加文件或文件夹
* @author Teddy
*
*/
public class ZipUtil {

/*存放添加的文件集合*/
private static Vector files = new Vector();
/*存放所有文件的集合*/
private static Vector all_files = new Vector();


/**
* 功能:
* @param args
*/
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println("开始压缩文件");
ZipUtil zip = new ZipUtil();
File f1 = new File("g:\\zip_test\\sogou_pinyin_52c.exe");
zip.addFile(f1);
zip.addFile(new File("g:\\xiahps\\主题\\note.Gadget"));
File ff [] = zip.getListFiles();
zip.zipFiles(ff, new File("g:\\abc.zip"), "g:\\");
zip.clear();
long b = System.currentTimeMillis()-a;
System.out.println("压缩完毕!耗时:"+(double)b/1000+"秒");
System.out.println("开始解压文件");
zip.unZipFiles("g:\\abc.zip","g:\\zzw");
long c = System.currentTimeMillis()-a;
System.out.println("解压完毕!总耗时:"+(double)c/1000+"秒");
}


public ZipUtil(){}
/**
* 添加待压缩的文件(支持添加文件夹)
* @param f
*/
public static void addFile(File f){
if(f==null||!f.exists())return;
if(!files.contains(f)) files.addElement(f);
}

/**
* 获取文件列表
* @return
*/
public static File [] getListFiles(){
File list_files [] = null;
if(files==null||files.size()==0)return null;
for(int i=0;i<files.size();i++){
File f = (File)files.get(i);
refreshFileList(f.getAbsolutePath());
}
list_files = new File[all_files.size()];
for(int i=0;i<all_files.size();i++){
list_files[i] = (File)all_files.elementAt(i);
}
return list_files;
}

/**
* 装载一个目录或文件
* @param strPath
*/
public static void refreshFileList(String strPath) {
File dir = new File(strPath);
//是文件直接装载
if(dir!=null&&dir.isFile()){all_files.add(dir);return;}
File[] ff = dir.listFiles();
if (ff == null)
return;
for (int i = 0; i < ff.length; i++) {
if (ff[i].isDirectory()) {
refreshFileList(ff[i].getAbsolutePath());
} else {
String strFileName = ff[i].getAbsolutePath().toLowerCase();
if(!all_files.contains(strFileName))
all_files.add(ff[i]);
}
}
}


/**
* 不替换路径的压缩
* @param srcfile
* @param zipfile
*/
public static void zipFiles(File[] srcfile,File zipfile){
zipFiles(srcfile,zipfile,null);
}

/**
* 功能:压缩多个文件或文件夹成一个zip文件
* @param srcfile:源文件列表
* @param zipfile:压缩后的文件
* @param repstr:绝对路径替换
*/
public static void zipFiles(File[] srcfile,File zipfile,String repstr){
byte[] buf=new byte[1024];
try {
ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipfile));
out.setEncoding("GBK");//解决中文问题
for(int i=0;i<srcfile.length;i++){
if(srcfile[i].isDirectory())zipFiles(srcfile[i].listFiles(),zipfile,repstr);//是文件夹,递归继续压缩
FileInputStream in=new FileInputStream(srcfile[i]);
if(repstr==null||repstr.equals(""))
out.putNextEntry(new ZipEntry(srcfile[i].getAbsolutePath()));
else
out.putNextEntry(new ZipEntry(com.jspsoft.util.StringEx.replace(srcfile[i].getAbsolutePath(), repstr, "")));//处理压缩文件带路径的情况,使用srcfile[i].getAbsolutePath()
//System.out.println("正在压缩 "+srcfile[i].getAbsolutePath());
int len;
//out.write(enstr.getBytes());
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
out.closeEntry();
in.close();
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 默认不带解压路径就解压到当前文件夹
* @param source
*/
public static void unZipFiles(String source){
unZipFiles(source,null);
}
/**
* 解压文件
* @param source:压缩文件
* @param destination:解压地址
*/
public static void unZipFiles(String source, String destination){
try {
if(destination==null||destination.equals(""))
destination = new File(source).getParent();
int buffer=1024;
ZipFile zipFile = new ZipFile(source);
Enumeration emu = zipFile.getEntries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
if(destination!=null&&destination.lastIndexOf("\\")!=destination.length()-1)
destination+="\\";//增强容错性
//System.out.println("正在解压 "+destination+entry.getName());
//目录不存在创建目录
if (entry.isDirectory()) {
new File(destination + entry.getName()).mkdirs();
continue;
}
BufferedInputStream bis = new BufferedInputStream(zipFile
.getInputStream(entry));
File file = new File(destination + entry.getName());
//文件所在目录如果不存在则创建
File parent = file.getParentFile();
if (parent != null && (!parent.exists())) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos, buffer);
int count;
byte data[] = new byte[buffer];
while ((count = bis.read(data, 0, buffer)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
bos.close();
bis.close();
}
zipFile.close();
} catch (Exception e) {e.printStackTrace();}
}


/**
* 释放资源
*/
public static void clear(){
if(all_files!=null&&all_files.size()>0)all_files.removeAllElements();
if(files!=null&&files.size()>0)files.removeAllElements();
}
public static Vector getFiles() {
return files;
}

public static void setFiles(Vector files) {
ZipUtil.files = files;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值