ZIP打包

本文介绍了一个Java实现的文件压缩与解压缩工具类,该工具可以将指定目录下的文件打包成ZIP格式,并支持解压ZIP文件到指定目录。使用了Apache Commons Compress库来处理ZIP文件。
摘要由CSDN通过智能技术生成

package com.snda.swp.util;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

public class Main {
private static String src = "D:\\apache-tomcat-6.0.28\\webapps\\swp1\\upload\\temporary\\我的站点";

private static String dst = "D:\\apache-tomcat-6.0.28\\webapps\\swp1\\upload\\compress\\cc.zip";

public static void main(String[] args) throws FileNotFoundException, Exception {
Main main = new Main(dst);
main.createZipOut();
main.packToolFiles(src, "");
main.closeZipOut();

//main = new Main("c:/test2.zip");
//main.createZipOut();
//main.packToolFiles("C:/test", "test");
//main.closeZipOut();

//Main.unZipToFolder("c:/test1.zip", "c:/test1");
//Main.unZipToFolder("c:/test2.zip", "c:/test2");
}

private OutputStream out = null;

private BufferedOutputStream bos = null;

private ZipArchiveOutputStream zaos = null;

private String zipFileName = null;

public Main(String zipname) {
this.zipFileName = zipname;
}

public void createZipOut() throws FileNotFoundException, IOException {
File f = new File(zipFileName);
out = new FileOutputStream(f);
bos = new BufferedOutputStream(out);
zaos = new ZipArchiveOutputStream(bos);
zaos.setEncoding("GBK");

}

public void closeZipOut() throws Exception {
zaos.flush();
zaos.close();

bos.flush();
bos.close();

out.flush();
out.close();
}

/**
* 把一个目录打包到zip文件中的某目录
*
* @param dirpath
* 目录绝对地址
* @param pathName
* zip中目录
*/
public void packToolFiles(String dirpath, String pathName) throws FileNotFoundException,
IOException {
if (StringUtils.isNotEmpty(pathName)) {
pathName = pathName + File.separator;
}
packToolFiles(zaos, dirpath, pathName);
}

/**
* 把一个目录打包到一个指定的zip文件中
*
* @param dirpath
* 目录绝对地址
* @param pathName
* zip文件抽象地址
*/
public void packToolFiles(ZipArchiveOutputStream zaos, String dirpath, String pathName)
throws FileNotFoundException, IOException {

ByteArrayOutputStream tempbaos = new ByteArrayOutputStream();
BufferedOutputStream tempbos = new BufferedOutputStream(tempbaos);

File dir = new File(dirpath);
// 返回此绝对路径下的文件
File[] files = dir.listFiles();
if (files == null || files.length < 1) {
return;
}
for (int i = 0; i < files.length; i++) {
// 判断此文件是否是一个文件夹
if (files[i].isDirectory()) {
packToolFiles(zaos, files[i].getAbsolutePath(), pathName + files[i].getName()
+ File.separator);
} else {
zaos.putArchiveEntry(new ZipArchiveEntry(pathName + files[i].getName()));
IOUtils.copy(new FileInputStream(files[i].getAbsolutePath()), zaos);
zaos.closeArchiveEntry();

}

}

tempbaos.flush();
tempbaos.close();

tempbos.flush();
tempbos.close();
}

/**
* 把一个zip文件解压到一个指定的目录中
*
* @param zipfilename
* zip文件抽象地址
* @param outputdir
* 目录绝对地址
*/
public static void unZipToFolder(String zipfilename, String outputdir) throws IOException {
File zipfile = new File(zipfilename);
if (zipfile.exists()) {
outputdir = outputdir + File.separator;
FileUtils.forceMkdir(new File(outputdir));

ZipFile zf = new ZipFile(zipfile, "GBK");
Enumeration zipArchiveEntrys = zf.getEntries();
while (zipArchiveEntrys.hasMoreElements()) {
ZipArchiveEntry zipArchiveEntry = (ZipArchiveEntry) zipArchiveEntrys.nextElement();
if (zipArchiveEntry.isDirectory()) {
FileUtils.forceMkdir(new File(outputdir + zipArchiveEntry.getName()
+ File.separator));
} else {
IOUtils.copy(zf.getInputStream(zipArchiveEntry), FileUtils
.openOutputStream(new File(outputdir + zipArchiveEntry.getName())));
}
}
} else {
throw new IOException("指定的解压文件不存在:\t" + zipfilename);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值