本实现逻辑依赖于apache.tools
压缩
package com.weavernorth.file;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* 阿帕奇压缩
* @author Dylan
*
*/
public class ZipCompressor {
private Logger logger = Logger.getLogger(ZipCompressor.class);
static final int BUFFER = 8192;
private File zipFile;
/**
* 压缩文件构造函数
* @param pathName 压缩的文件存放目录
*/
public ZipCompressor(String pathName) {
zipFile = new File(pathName);
}
/**
* 执行压缩操作
* @param srcPathName 被压缩的文件/文件夹
*/
public void compressExe(String srcPathName) {
File file = new File(srcPathName);
if (!file.exists()){
throw new RuntimeException(srcPathName + "不存在!");
}
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compressByType(file, out, basedir);
out.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("执行压缩操作时发生异常:"+e);
throw new RuntimeException(e);
}
}
/**
* 判断是目录还是文件,根据类型(文件/文件夹)执行不同的压缩方法
* @param file
* @param out
* @param basedir
*/
private void compressByType(File file, ZipOutputStream out, String basedir) {
/* 判断是目录还是文件 */
if (file.isDirectory()) {
logger.info("压缩:" + basedir + file.getName());
this.compressDirectory(file, out, basedir);
} else {
logger.info("压缩:" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
/**
* 压缩一个目录
* @param dir
* @param out
* @param basedir
*/
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists()){
return;
}
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
/* 递归 */
compressByType(files[i], out, basedir + dir.getName() + "/");
}
}
/**
* 压缩一个文件
* @param file
* @param out
* @param basedir
*/
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
解压
package com.weavernorth.file;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
/**
* 阿帕奇解压
* @author Dylan
*
*/
public class ZipDecompress {
/**
* 解压到指定目录
* @param zipPath
* @param descDir
*/
public static void unZipFiles(String zipPath,String descDir)throws IOException{
unZipFiles(new File(zipPath), descDir);
}
/**
* 解压文件到指定目录
* @param zipFile
* @param descDir
*/
@SuppressWarnings("rawtypes")
public static void unZipFiles(File zipFile,String descDir)throws IOException{
File pathFile = new File(descDir);
if(!pathFile.exists()){
pathFile.mkdirs();
}
ZipFile zip = new ZipFile(zipFile);
for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if(!file.exists()){
file.mkdirs();
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if(new File(outPath).isDirectory()){
continue;
}
//输出文件路径信息
System.out.println(outPath);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[1024];
int len;
while((len=in.read(buf1))>0){
out.write(buf1,0,len);
}
in.close();
out.close();
}
System.out.println("******************解压完毕********************");
}
}