这两天,teme leader让我做个需求,其中用java打zip包文件,自己还从来没做过,这次完成了,就顺便将这个打包过程写成了一个工具类。
其实蛮简单的,主要就是用调用 java.util.zip.*的java API.
代码:
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.io.OutputStream; import java.util.Enumeration; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * * @author niliang * */ public class ZipFileUtils { /** * Compress file * @param zipFileName the compress file name * @param srcPathName the subject file or directory to be compressed * @throws IOException */ public static void zip(String zipFileName,String srcPathName) throws IOException{ File file = new File(srcPathName); if(!file.exists()){ throw new RuntimeException("Sorry,"+srcPathName+" not exists."); } FileOutputStream fos = new FileOutputStream(new File(zipFileName)); CheckedOutputStream cos = new CheckedOutputStream(fos,new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); String basedir = ""; compress(file,out,basedir); out.flush(); out.close(); } private static void compress(File file,ZipOutputStream out,String basedir) throws IOException{ if(file.isDirectory()){ compressDirectory(file,out,basedir); }else{ compressFile(file,out,basedir); } } private static void compressDirectory(File dir,ZipOutputStream out,String basedir) throws IOException{ if(!dir.exists()){ return; } File []files = dir.listFiles(); for(int i=0,len=files.length;i<len;i++){ compress(files[i],out,basedir+dir.getName()+"/"); } } private static void compressFile(File file,ZipOutputStream out,String basedir) throws IOException{ if(!file.exists()){ return; } BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ZipEntry entry = new ZipEntry(basedir+file.getName()); out.putNextEntry(entry); int len = 0; byte []data = new byte[1024]; while((len=bis.read(data))!=-1){ out.write(data,0,len); } bis.close(); } /** * uncompress file * @param zipFilePath file endWith '.zip' which to be uncompressed * @param unzipDirectory uncompress files location * @throws IOException * @throws IOException */ public static void unzip(String zipFilePath,String unzipDirectory) throws IOException, IOException{ File file = new File(zipFilePath); ZipFile zipFile = new ZipFile(file); File unzipFile = new File(unzipDirectory+"/"+getPrefixName(zipFile.getName())); if(unzipFile.exists()){ unzipFile.delete(); } unzipFile.mkdirs(); Enumeration zipEnum = zipFile.entries(); InputStream in = null; OutputStream out = null; ZipEntry entry = null; while(zipEnum.hasMoreElements()){ entry = (ZipEntry) zipEnum.nextElement(); String entryName = entry.getName(); String []names = entryName.split("\\/"); int len = names.length; String path = unzipFile.getAbsolutePath(); for(int i=0;i<len;i++){ if(i<len-1){ path +="/"+names[i]+"/"; createDir(path); }else{ if(entryName.endsWith("/")){ createDir(unzipFile.getAbsolutePath()+"/"+entryName); }else{ in = zipFile.getInputStream(entry); out = new FileOutputStream(new File(unzipFile.getAbsolutePath()+"/"+entryName)); byte []b = new byte[1024]; int pos = 0; while((pos = in.read(b))!=-1){ out.write(b,0,pos); } in.close(); out.flush(); out.close(); } } } } zipFile.close(); } //create directory private static void createDir(String path){ File dir = new File(path); if(!dir.exists()){ dir.mkdir(); } } //get prefix name eg:demo.zip prefixname='demo' private static String getPrefixName(String name){ return name.substring(0,name.lastIndexOf(".")); } }