import java.io.*; import org.apache.tools.zip.*; import java.util.Enumeration; /** *功能:zip压缩、解压(支持中文文件名) *说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能. * 解决了由于java.util.zip包不支持汉字的问题。 * 使用java.util.zip包时,当zip文件中有名字为中文的文件时, * 就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentException * at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285) *注意: * 1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*; * 2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url] * 3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant[/url] ... g/apache/tools/zip/ * 4、本程序使用Ant 1.7.1 中的ant.jar * *仅供编程学习参考. * 2010-11-19 * 修改 void unZip(String)方法 改为 void unZip(String,String) * 增加解压zip中指定某文件功能 *@author Winty *@author Lily *@date 2008-8-3 *@Usage: * 压缩:java AntZip -zip "directoryName" * 解压:java AntZip -unzip "fileName.zip" */ public class AntZip{ private ZipFile zipFile; private ZipOutputStream zipOut; //压缩Zip private ZipEntry zipEntry; private static int bufSize; //size of bytes private byte[] buf; private int readedBytes; public AntZip(){ this(512); } public AntZip(int bufSize){ this.bufSize = bufSize; this.buf = new byte[this.bufSize]; } //压缩文件夹内的文件 public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名 File file; File zipDir; zipDir = new File(zipDirectory); String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名 try{ this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName))); handleDir(zipDir , this.zipOut); this.zipOut.close(); }catch(IOException ioe){ ioe.printStackTrace(); } } //由doZip调用,递归完成目录文件读取 private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{ FileInputStream fileIn; File[] files; files = dir.listFiles(); if(files.length == 0){//如果目录为空,则单独创建之. //ZipEntry的isDirectory()方法中,目录以"/"结尾. this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/")); this.zipOut.closeEntry(); } else{//如果目录不为空,则分别处理目录和文件. for(File fileName : files){ //System.out.println(fileName); if(fileName.isDirectory()){ handleDir(fileName , this.zipOut); } else{ fileIn = new FileInputStream(fileName); this.zipOut.putNextEntry(new ZipEntry(fileName.toString())); while((this.readedBytes = fileIn.read(this.buf))>0){ this.zipOut.write(this.buf , 0 , this.readedBytes); } this.zipOut.closeEntry(); } } } } /** * 解压指定zip文件 * @param unZipfileName 需要解压的zip * @param targer 如果非解压zip文件里指定的文件请设置null,如果不为空则解压zip里targert指定的文件 */ @SuppressWarnings("unchecked") public void unZip(String unZipfileName,String target){//unZipfileName需要解压的zip文件名 int index = unZipfileName.lastIndexOf(File.separator); String path = unZipfileName.substring(0, index); FileOutputStream fileOut; File file; InputStream inputStream; try{ this.zipFile = new ZipFile(unZipfileName); for(Enumeration entries = this.zipFile.getEntries(); entries.hasMoreElements();){ ZipEntry entry = (ZipEntry)entries.nextElement(); /* * ***************************************** * 当target不为空是解压zip中的指定文件即解压target * ***************************************** */ if(target!=null){ String tmp = null;//存放zip包中的文件名称不包含文件夹 /* * 从entry中分割出文件名称 */ if(entry.getName().contains(File.separator)){//如果entry包含文件路径和名称提取以File.separator分割的文件的名称 String[] sp = entry.getName().split(File.separator); tmp = sp[sp.length-1]; }else if(entry.getName().contains("/")){//如果entry包含文件路径和名称提取以"/"分割的文件的名称 String[] sp = entry.getName().split("/"); tmp = sp[sp.length-1]; }else {//entry不包含文件路径着直接返回 tmp = entry.getName(); } if(!tmp.equals(target)) continue; } file = new File(path+File.separator+entry.getName()); if(entry.isDirectory()){ file.mkdirs(); } else{ //如果指定文件的目录不存在,则创建之. File parent = file.getParentFile(); if(!parent.exists()){ parent.mkdirs(); } inputStream = zipFile.getInputStream(entry); fileOut = new FileOutputStream(file); while(( this.readedBytes = inputStream.read(this.buf) ) > 0){ fileOut.write(this.buf , 0 , this.readedBytes ); } fileOut.close(); inputStream.close(); } } this.zipFile.close(); }catch(IOException ioe){ ioe.printStackTrace(); } } //设置缓冲区大小 public void setBufSize(int bufSize){ this.bufSize = bufSize; } //测试AntZip类 public static void main(String[] args)throws Exception{ String[] arg = new String[2]; arg[1]="D://网上商城.zip"; arg[0]="-unzip"; if(arg.length==2){ String name = arg[1]; AntZip zip = new AntZip(); if(arg[0].equals("-zip")) zip.doZip(name); else if(arg[0].equals("-unzip")) zip.unZip(name,"脚本.sql"); } else{ System.out.println("Usage:"); System.out.println("压缩:java AntZip -zip directoryName"); System.out.println("解压:java AntZip -unzip fileName.zip"); throw new Exception("Arguments error!"); } } }