package com.necapi.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class ZipFileUtil {
private String zipFileName; // 压缩到的地方(目录)
private String sourceFileName; //源文件(带压缩的文件或文件夹)
public ZipFileUtil(String zipFileName,String sourceFileName)
{
this.zipFileName=zipFileName;
this.sourceFileName=sourceFileName;
}
public void zip() throws Exception
{
//File zipFile = new File(zipFileName);
System.out.println("压缩中...");
//创建zip输出流
ZipOutputStream out = new ZipOutputStream( new FileOutputStream(zipFileName));
File sourceFile = new File(sourceFileName);
//调用函数
compress(out,sourceFile,sourceFile.getName());
out.close();
System.out.println("压缩完成");
}
public void compress(ZipOutputStream out,File sourceFile,String base) throws Exception
{
//如果路径为目录(文件夹)
if(sourceFile.isDirectory())
{
//取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
if(flist.length==0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
{
System.out.println(base+"/");
out.putNextEntry( new ZipEntry(base+"/") );
}
else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
{
for(int i=0;i
{
compress(out,flist[i],base+"/"+flist[i].getName());
}
}
}
else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
{
out.putNextEntry( new ZipEntry(base) );
FileInputStream fos = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fos);
int tag;
System.out.println(base);
//将源文件写入到zip文件中
while((tag=bis.read())!=-1)
{
out.write(tag);
}
bis.close();
fos.close();
}
}
public void unzip(File file,String unzippath) throws IOException {
ZipFile zf = new ZipFile(file,Charset.forName("GBK"));
Enumeration entries = zf.entries();
ZipEntry entry = null;
while (entries.hasMoreElements()) {
entry = (ZipEntry) entries.nextElement();
System.out.println("解压" + entry.getName());
if (entry.isDirectory()) {
String dirPath = unzippath + File.separator + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
InputStream is = zf.getInputStream(entry);
// 表示文件
File f = new File(unzippath + File.separator + entry.getName());
//文件名
String filename= f.getName();
if (!f.exists()) {
File fileParent = f.getParentFile();
if(!fileParent.exists()){
fileParent.mkdirs();
}
}
f.createNewFile();
// 将压缩文件内容写入到这个文件中
FileOutputStream fos = new FileOutputStream(f);
int count;
byte[] buf = new byte[8192];
while ((count = is.read(buf)) != -1) {
fos.write(buf, 0, count);
}
fos.flush();
fos.close();
is.close();
}
}
zf.close();
}
public static void main(String[] args) throws Exception {
ZipFileUtil zipFileUtil=new ZipFileUtil("C:\\Users\\lenovo\\Desktop\\b.zip", "C:\\Users\\lenovo\\Desktop\\b");
//压缩
zipFileUtil.zip();
//解压
zipFileUtil.unzip(new File("C:\\Users\\lenovo\\Desktop\\b.zip"), "C:\\Users\\lenovo\\Desktop\\c");
}
}