athrunwang

          紀(jì)元
          數(shù)據(jù)加載中……
          使用org.apache.tools.zip實(shí)現(xiàn)zip壓縮和解壓
          原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、作者信息和本聲明。否則將追究法律責(zé)任。http://wintys.blog.51cto.com/425414/90878
          import java.io.*;
          import org.apache.tools.zip.*;
          import java.util.Enumeration;
          /**
          *功能:zip壓縮、解壓(支持中文文件名)
          *說明:本程序通過使用Apache Ant里提供的zip工具org.apache.tools.zip實(shí)現(xiàn)了zip壓縮和解壓功能.
          *   解決了由于java.util.zip包不支持漢字的問題。
          *   使用java.util.zip包時(shí),當(dāng)zip文件中有名字為中文的文件時(shí),
          *   就會出現(xiàn)異常:"Exception  in thread "main " java.lang.IllegalArgumentException  
          *               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
          *注意:
          *   1、使用時(shí)把a(bǔ)nt.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
          *
          *僅供編程學(xué)習(xí)參考.
          *
          *@author Winty
          *@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];
              }
              
              //壓縮文件夾內(nèi)的文件
              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調(diào)用,遞歸完成目錄文件讀取
              private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{
                  FileInputStream fileIn;
                  File[] files;

                  files = dir.listFiles();
              
                  if(files.length == 0){//如果目錄為空,則單獨(dú)創(chuàng)建之.
                      //ZipEntry的isDirectory()方法中,目錄以"/"結(jié)尾.
                      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文件
              public void unZip(String unZipfileName){//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(entry.getName());

                          if(entry.isDirectory()){
                              file.mkdirs();
                          }
                          else{
                              //如果指定文件的目錄不存在,則創(chuàng)建之.
                              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();
                  }
              }

              //設(shè)置緩沖區(qū)大小
              public void setBufSize(int bufSize){
                  this.bufSize = bufSize;
              }

              //測試AntZip類
              public static void main(String[] args)throws Exception{
                  if(args.length==2){
                      String name = args[1];
                      AntZip zip = new AntZip();

                      if(args[0].equals("-zip"))
                          zip.doZip(name);
                      else if(args[0].equals("-unzip"))
                          zip.unZip(name);
                  }
                  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!");
                  }
              }
          }

          posted on 2012-01-03 17:32 AthrunWang 閱讀(1553) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 华安县| 图们市| 正定县| 北碚区| 长顺县| 朝阳区| 施甸县| 乌拉特前旗| 措勤县| 东阳市| 沈丘县| 青河县| 龙海市| 金门县| 柳河县| 邵东县| 龙泉市| 特克斯县| 定襄县| 古田县| 九龙县| 玉林市| 高唐县| 樟树市| 永和县| 若尔盖县| 普定县| 休宁县| 深泽县| 安乡县| 南华县| 合山市| 中超| 乌海市| 固安县| 岢岚县| 军事| 柞水县| 彭州市| 商丘市| 万宁市|