ZipFile(怎么实现对文件和目录的压缩,解压缩

ZipFile(如何实现对文件和目录的压缩,解压缩?

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipFile {
	public static void main(String[] args) {

	}

	/**
	 * 文件压缩
	 * files:要压缩的文件
	 * destZip:压缩之后的zip文件所放的目录,需要"D:\\"或"D:\\test\"格式
	 * */

	public static void zip(String[] files, String destZip) throws IOException {
		FileOutputStream fos = new FileOutputStream(destZip);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		ZipOutputStream zos = new ZipOutputStream(bos);

		//循环读文件,压缩到zip中
		for (int i = 0; i < files.length; i++) {
			String file = files[i];
			FileInputStream fis = new FileInputStream(file);
			BufferedInputStream bis = new BufferedInputStream(fis);
			//获取文件名,创建条目并添加到zip中
			File f = new File(file);
			ZipEntry zl = new ZipEntry(f.getName());
			zos.putNextEntry(zl);
			//读取文件中的字节信息,压入条目
			int tmp = -1;
			while ((tmp = bis.read()) != -1) {
				zos.write(tmp);
			}
			zos.closeEntry();
			bis.close();
			fis.close();
		}
		zos.close();
		bos.close();
		fos.close();
	}

	/**
	 * 文件解压缩
	 * zipfile:要解压缩的zip文件
	 * destpah:解压后文件所放的目录,需要"D:\\"或"D:\\test\"格式
	 * */
	public static void unzip(String zipfile, String destpath) throws IOException {
		FileInputStream fis = new FileInputStream("C:\\a.zip");
		ZipInputStream zis = new ZipInputStream(fis);
		ZipEntry zl = null;
		while ((zl = zis.getNextEntry()) != null) {
			if (zl.isDirectory()) {
				File f = new File("C:\\" + zl.getName());
				f.mkdirs();
			} else {
				String file = zl.getName();
				FileOutputStream fos = new FileOutputStream(destpath + file);
				int tmp = -1;
				while ((tmp = zis.read()) != -1) {
					fos.write(tmp);
				}
				zis.closeEntry();
				fos.close();
			}
		}
		zis.close();
	}
	
	/**
	 * 压缩目录
	 * zipFileName:压缩后zip文件的路径
	 * inputFile:需要压缩的源目录
	 * */
	public void zip(String zipFileName,String inputFile)throws Exception{
		File file =new File(inputFile);
		ZipOutputStream out =new ZipOutputStream(new FileOutputStream(zipFileName));
		zip(out,file,"");
		System.out.println("zip done");
		out.close();
		
	}
	//递归遍历子目录和文件,进行压缩
	private void zip(ZipOutputStream out, File f, String base) throws Exception{
		System.out.println("Zipping"+f.getName());
		if(f.isDirectory()){
			File[] fl=f.listFiles();
			out.putNextEntry(new ZipEntry(base+"/"));
			base = base.length()==0?"":base+"/";
			for(int i=0;i<fl.length;i++){
				zip(out,fl[i],base+fl[i].getName());
			}
		}else{
			out.putNextEntry(new ZipEntry(base));
			FileInputStream in =new FileInputStream(f);
			int b;
			while((b=in.read())!=-1){
				out.write(b);
				in.close();
			}
		}
	}
	
	/**
	 * 解压缩目录
	 * zipFileName:需要解压缩的zip文件
	 * outputDirectory:解压缩后文件所放路径
	 * */
	public void unzip2(String zipFileName,String outputDirectory) throws Exception{
		ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
		ZipEntry z;
		while((z=in.getNextEntry())!=null){
			System.out.println("unziping:"+z.getName());
			if(z.isDirectory()){
				String name=z.getName();
				name=name.substring(0,name.length()-1);
				File f=new File(outputDirectory+File.separator+name);
				f.mkdirs();
				System.out.println("mkdirs:"+outputDirectory+File.separator+name);
			}else{
				File f=new File(outputDirectory+File.separator+z.getName());
				f.createNewFile();
				FileOutputStream out=new FileOutputStream(f);
				int b;
				while((b=in.read())!=-1){
					out.write(b);
				}
				out.close();
			}
		}
		in.close();
	}
}