package com.ahzc.test;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;public class Compress {	/** 	  * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件	  * @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件;	  *      如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,则只压缩本文件	  * @param zipFile 最后压缩的文件路径和名称,eg:D:\\MyEclipse\\first\\testFile\\aa.zip	  */	 public static File doZip(String sourceDir, String zipFilePath) 	 throws IOException {	  	  File file = new File(sourceDir);	  File zipFile = new File(zipFilePath);	  ZipOutputStream zos = null;	  try {	   // 创建写出流操作	   OutputStream os = new FileOutputStream(zipFile);	   BufferedOutputStream bos = new BufferedOutputStream(os);	   zos = new ZipOutputStream(bos);	   	   String basePath = null;	   	   // 获取目录	   if(file.isDirectory()) {	    basePath = file.getPath();	   }else {	    basePath = file.getParent();	   }	   	   zipFile(file, basePath, zos);	  }finally {	   if(zos != null) {	    zos.closeEntry();	    zos.close();	   }	  }	  	  return zipFile;	 }	 /** 	  * @param source 源文件	  * @param basePath 	  * @param zos 	  */	 private static void zipFile(File source, String basePath, ZipOutputStream zos) 	 throws IOException {	  File[] files = null;	  if (source.isDirectory()) {	   files = source.listFiles();	  } else {	   files = new File[1];	   files[0] = source;	  }	  	  InputStream is = null;	  String pathName;	  byte[] buf = new byte[1024];	  int length = 0;	  try{	   for(File file : files) {//循环压缩文件夹下面的所有文件,知道zos.close的时候才算压缩完成	    if(file.isDirectory()) {	     pathName = file.getPath().substring(basePath.length() + 1) + "/";	     zos.putNextEntry(new ZipEntry(pathName));	     zipFile(file, basePath, zos);	    }else {	     pathName = file.getPath().substring(basePath.length() + 1);	     is = new FileInputStream(file);	     BufferedInputStream bis = new BufferedInputStream(is);	     zos.putNextEntry(new ZipEntry(pathName));	     while ((length = bis.read(buf)) > 0) {	      zos.write(buf, 0, length);	     }	    }	   }	  }finally {	   if(is != null) {	    is.close();	   }	  }	 }	 	 /**		 * 解压到指定目录		 * @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 zipFile2,String descDir)throws IOException{			 try {		         //根据ZIP文件创建ZipFile对象		         ZipFile zipFile = new ZipFile(zipFile2);		            ZipEntry entry = null;		            String entryName = null;		            String targetFileName = null;		            byte[] buffer = new byte[1024];		            int bytes_read; 		            //获取ZIP文件里所有的entry		            Enumeration entrys = zipFile.entries();		            //遍历所有entry		            while (entrys.hasMoreElements()) {		             entry = (ZipEntry)entrys.nextElement();		             //获得entry的名字		             entryName =  entry.getName();		             targetFileName = descDir+File.separator+entryName;		             if (entry.isDirectory()){		              //  如果entry是一个目录,则创建目录		              new File(targetFileName).mkdirs();		              continue;		             } else {		              // 如果entry是一个文件,则创建父目录		              new File(targetFileName).getParentFile().mkdirs();		             }		             //否则创建文件		             File targetFile = new File(targetFileName);		             System.out.println("创建文件:" + targetFile.getAbsolutePath());		             //打开文件输出流		             FileOutputStream os = new FileOutputStream(targetFile);		             //从ZipFile对象中打开entry的输入流		             InputStream  is = zipFile.getInputStream(entry);		             while ((bytes_read = is.read(buffer)) != -1){		              os.write(buffer, 0, bytes_read);		             }		             //关闭流		             os.close( );		             is.close( );		            }		            System.out.println("解压缩文件成功!");		        } catch (IOException err) {		            System.err.println("解压缩文件失败: " + err);		        }		}}

/**	 * 将zip压缩包解压到目标路径	 * @param srcPath 目标路径	 * @param zipPath zip压缩包路径	 * @return boolean ret 是否解压成功	 * */	public static boolean swapZipToDirectory(String srcPath, String zipPath)	{		boolean ret = true;		//解压缩目录zipPath这个文件到 SwapPath目录		if (!new File(zipPath).exists()){			ret = false;			return ret;		}				if (!new File(srcPath).exists()){			(new File(srcPath)).mkdirs();		}				Project proj = new Project();		Expand expand = new Expand();		expand.setProject(proj);		expand.setTaskType("UNZIP");		expand.setTaskName("UNZIP");		expand.setEncoding("GBK");		expand.setSrc(new File(zipPath));		expand.setDest(new File(srcPath));		expand.execute();				return ret;	}
/**	 * 将目标路径压缩成zip压缩包	 * @param srcPath 目标路径	 * @param zipPath zip压缩包路径	 * @return boolean ret 是否压缩成功	 * */	public static boolean swapDirectoryToZip(String srcPath, String zipPath)	{		//压缩目录xmldirPath下的所有文件		boolean ret = true;		File objFile = new File(srcPath);		if (!objFile.exists()){			ret = false;			return ret;		}		Project objProject = new Project();		FileSet objFileSet = new FileSet();		objFileSet.setProject(objProject);		// 判断是目录还是文件		if (objFile.isDirectory()) {			objFileSet.setDir(objFile);		} else {			objFileSet.setFile(objFile);		}		Zip objZip = new Zip();		objZip.setProject(objProject);		objZip.setDestFile(new File(zipPath));		objZip.addFileset(objFileSet);		objZip.setEncoding("GBK");		objZip.execute();				return ret;	}