package org.easyelf.util; 


  import java.io.BufferedInputStream; 

 

  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.util.ArrayList; 

 

  import java.util.Enumeration; 

 

  import java.util.List; 

 
 
 
 

  import org.apache.tools.zip.ZipEntry; 

 

  import org.apache.tools.zip.ZipFile; 

 

  import org.apache.tools.zip.ZipOutputStream; 

 

  /** 

 

  *功能: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-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url] 

 

  * 4、本程序使用Ant 1.7.1 中的ant.jar 

 

  * 

 

  *仅供编程学习参考. 

 

  * 

 

  *@author 

 

  *@date 

 

  *@Usage: 

 

  * 压缩:java AntZip -zip "directoryName" 

 

  * 解压:java AntZip -unzip "fileName.zip" 

 

  */ 

 
 
 
 

  public class ZipUtils{ 

 

  private ZipFile zipFile; 

 

  private ZipOutputStream zipOut; //压缩Zip 

 

  private ZipEntry zipEntry; 

 

  private static int bufSize; //size of bytes 

 

  private byte[] buf; 

 

  private int readedBytes; 

 
 

  public ZipUtils(){ 

 

  this(1024); 

 

  } 

 
 
 
 

  public ZipUtils(int bufSize){ 

 

  this.bufSize = bufSize; 

 

  this.buf = new byte[this.bufSize]; 

 

  } 

 
 

  /** 

 

  * 压缩文件夹内的文件 

 

  * 

 

  * @param unZipFile 

 

  * 需要解压的zip文件对象 

 

  * @param unZipFilePath 需要加压到指定的目录 

 

  * @throws IOException 

 

  */ 

 

  public void doZip(String filePath, String zipFilePath) { 

 

  FileOutputStream fos = null; 

 

  ZipOutputStream zos = null; 

 

  try { 

 

  File zipDir = new File(filePath); 

 

  String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名 

 

  fos = new FileOutputStream(zipFilePath+zipFileName); 

 

  zos = new ZipOutputStream(fos); 

 

  handleDir(new File(filePath), zos, ""); 

 

  } catch (FileNotFoundException e) { 

 

  e.printStackTrace(); 

 

  } catch (IOException e) { 

 

  // TODO Auto-generated catch block 

 

  e.printStackTrace(); 

 

  } finally { 

 

  try { 

 

  if (zos != null) 

 

  zos.close(); 

 

  } catch (IOException e) { 

 

  e.printStackTrace(); 

 

  } 

 

  try { 

 

  if (fos != null) 

 

  fos.close(); 

 

  } catch (IOException e) { 

 

  e.printStackTrace(); 

 

  } 

 

  } 

 

  } 

 
 
 
 

  //由doZip调用,递归完成目录文件读取 

 

  private void handleDir(File f, ZipOutputStream zos, String hiberarchy) throws IOException { 

 

  if (f.exists()) { 

 

  if (f.isDirectory()) { 

 

  hiberarchy += f.getName() + "/"; 

 

  File[] fif = f.listFiles(); 

 

  if(fif.length == 0){//如果目录为空,则单独创建之. 

 

  ZipEntry ze = new ZipEntry(hiberarchy); 

 

  zos.putNextEntry(ze); 

 

  }else{//如果目录不为空,则分别处理目录和文件. 

 

  for (int i = 0; i < fif.length; i++) { 

 

  handleDir(fif[i], zos, hiberarchy); 

 

  } 

 

  } 

 

  } else { 

 

  FileInputStream fis = null; 

 

  try { 

 

  fis = new FileInputStream(f); 

 

  ZipEntry ze = new ZipEntry(hiberarchy + f.getName()); 

 

  zos.putNextEntry(ze); 

 

  while((this.readedBytes = fis.read(this.buf))>0){ 

 

  zos.write(this.buf , 0 , this.readedBytes); 

 

  } 

 

  zos.closeEntry(); 

 

  } catch (FileNotFoundException e) { 

 

  e.printStackTrace(); 

 

  } catch (IOException e) { 

 

  e.printStackTrace(); 

 

  } finally { 

 

  try { 

 

  if (fis != null) 

 

  fis.close(); 

 

  } catch (IOException e) { 

 

  e.printStackTrace(); 

 

  } 

 

  } 

 

  } 

 

  } 

 
 
 
 

  } 

 

  /** 

 

  * 解压指定zip文件。 

 

  * 

 

  * @param unZipFile 

 

  * 需要解压的zip文件对象 

 

  * @param unZipFilePath 需要解压到指定的目录 

 

  */ 

 

  public void unZip(String unZipfileName,String unZipFilePath){//unZipfileName需要解压的zip文件名 

 

  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(); 

 

  file = new File(unZipFilePath+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; 

 

  } 

 

  /** 

 

  * 把接受的全部文件打成压缩包 

 

  * @param List<File>; 

 

  * @param org.apache.tools.zip.ZipOutputStream 

 

  */ 

 
 
 
 

  public void zipFile 

 

  (List files,ZipOutputStream outputStream) { 

 

  int size = files.size(); 

 

  for(int i = 0; i < size; i++) { 

 

  File file = (File) files.get(i); 

 

  zipFile(file, outputStream,""); 

 

  } 

 

  } 

 

  /** 

 

  * 根据输入的文件与输出流对文件进行打包 

 

  * @param File 

 

  * @param org.apache.tools.zip.ZipOutputStream 

 

  */ 

 

  public void zipFile(File inputFile, 

 

  ZipOutputStream ouputStream,String hiberarchy) { 

 

  try { 

 

  if(inputFile.exists()) { 

 

  /**如果是目录的话这里是不采取操作的, 

 

  * 至于目录的打包正在研究中*/ 

 

  if (inputFile.isFile()) { 

 

  FileInputStream IN = new FileInputStream(inputFile); 

 

  BufferedInputStream bins = new BufferedInputStream(IN, 512); 

 

  //org.apache.tools.zip.ZipEntry 

 

  ZipEntry entry = new ZipEntry(inputFile.getName()); 

 

  ouputStream.putNextEntry(entry); 

 

  // 向压缩文件中输出数据 

 

  while ((this.readedBytes = bins.read(this.buf)) != -1) { 

 

  ouputStream.write(this.buf, 0, this.readedBytes); 

 

  } 

 

  // 关闭创建的流对象 

 

  bins.close(); 

 

  IN.close(); 

 

  } else { 

 

  hiberarchy += inputFile.getName() + "/"; 

 

  File[] fif = inputFile.listFiles(); 

 

  if(fif.length == 0){//如果目录为空,则单独创建之. 

 

  ZipEntry ze = new ZipEntry(hiberarchy); 

 

  ouputStream.putNextEntry(ze); 

 

  }else{//如果目录不为空,则分别处理目录和文件. 

 

  for (int i = 0; i < fif.length; i++) { 

 

  handleDir(fif[i], ouputStream, hiberarchy); 

 

  } 

 

  } 

 

  } 

 

  } 

 

  } catch (Exception e) { 

 

  e.printStackTrace(); 

 

  } 

 

  } 

 
 
 
 

  //测试AntZip类 

 

  public static void main(String[] args)throws Exception{ 

 

  ZipUtils zip = new ZipUtils(); 

 

  String name = "C:/Documents and Settings/Administrator/桌面/css.zip"; 

 

  // 

 

  zip.unZip(name,"C:/Documents and Settings/Administrator/桌面/"); 

 
 

  //String path = getRequest().getSession().getServletContext().getRealPath("/")+"/scripts/map/"; 

 

  // zip.doZip("D:/zip解压","D:/"); 

 

  // zip.doZip("D:/20130530154158_pgzw", "E:/"); 

 

  /**这个集合就是你想要打包的所有文件, 

 

  * 这里假设已经准备好了所要打包的文件*/ 

 

  // List<File> files = new ArrayList<File>(); 

 

  // files.add(new File("D:\\wwgxpt\\wwgxpt\\WebRoot\\fujian\\")); 

 

  // files.add(new File("D:/20130518110527424_zwpg/20130518110527424_zwpg.xml")); 

 

  // /**创建一个临时压缩文件, 

 

  // * 我们会把文件流全部注入到这个文件中 

 

  // * 这里的文件你可以自定义是.rar还是.zip*/ 

 

  // File file = new File("D:/certpics.zip"); 

 

  // if (!file.exists()){ 

 

  // file.createNewFile(); 

 

  // } 

 

  // //创建文件输出流 

 

  // FileOutputStream fous = new FileOutputStream(file); 

 

  // /**打包的方法我们会用到ZipOutputStream这样一个输出流, 

 

  // * 所以这里我们把输出流转换一下*/ 

 

  // ZipOutputStream zipOut 

 

  // = new ZipOutputStream(fous); 

 

  // /**这个方法接受的就是一个所要打包文件的集合, 

 

  // * 还有一个ZipOutputStream*/ 

 

  // zip.zipFile(files, zipOut); 

 

  // zipOut.close(); 

 

  // fous.close(); 

 
 
 
 

  } 

 
 

  public void zipFiles(List files,List<String> fileName,ZipOutputStream outputStream) { 

 

  int size = files.size(); 

 

  for(int i = 0; i < size; i++) { 

 

  File file = (File) files.get(i); 

 

  String filename = fileName.get(i); 

 

  zipFileReName(file,filename, outputStream,""); 

 

  } 

 

  } 

 

  public void zipFileReName(File inputFile,String fileName, 

 

  ZipOutputStream ouputStream,String hiberarchy) { 

 

  try { 

 

  if(inputFile.exists()) { 

 

  /**如果是目录的话这里是不采取操作的, 

 

  * 至于目录的打包正在研究中*/ 

 

  if (inputFile.isFile()) { 

 

  FileInputStream IN = new FileInputStream(inputFile); 

 

  BufferedInputStream bins = new BufferedInputStream(IN, 512); 

 

  //org.apache.tools.zip.ZipEntry 

 

  ZipEntry entry = new ZipEntry(fileName); 

 

  ouputStream.putNextEntry(entry); 

 

  // 向压缩文件中输出数据 

 

  while ((this.readedBytes = bins.read(this.buf)) != -1) { 

 

  ouputStream.write(this.buf, 0, this.readedBytes); 

 

  } 

 

  // 关闭创建的流对象 

 

  bins.close(); 

 

  IN.close(); 

 

  } else { 

 

  hiberarchy += inputFile.getName() + "/"; 

 

  File[] fif = inputFile.listFiles(); 

 

  if(fif.length == 0){//如果目录为空,则单独创建之. 

 

  ZipEntry ze = new ZipEntry(hiberarchy); 

 

  ouputStream.putNextEntry(ze); 

 

  }else{//如果目录不为空,则分别处理目录和文件. 

 

  for (int i = 0; i < fif.length; i++) { 

 

  handleDir(fif[i], ouputStream, hiberarchy); 

 

  } 

 

  } 

 

  } 

 

  } 

 

  } catch (Exception e) { 

 

  e.printStackTrace(); 

 

  } 

 

  } 

 

  public void doZipByFile(String path,List<String> listName,List<String> pathList){ 

 

  ZipOutputStream zs = null; 

 

  FileOutputStream fileout = null; 

 

  List<File> list; 

 

  ZipUtils zu = new ZipUtils(); 

 
 

  try { 

 

  File file = new File(path); 

 

  if (!file.exists()){ 

 

  file.createNewFile(); 

 

  } 

 

  fileout = new FileOutputStream(file); 

 

  zs= new ZipOutputStream(file); 

 

  list = new ArrayList<File>(); 

 

  for (int i = 0; i < pathList.size(); i++) { 

 

  list.add(new File(pathList.get(i))); 

 

  } 

 

  zs.setEncoding("GBK"); 

 

  zu.zipFiles(list,listName, zs); 

 

  fileout.close(); 

 

  zs.close(); 

 

  } catch (IOException e) { 

 

  // TODO Auto-generated catch block 

 

  e.printStackTrace(); 

 

  } 

 

  } 

 

  }