athrunwang

          紀元
          數據加載中……
          使用org.apache.tools.zip實現zip壓縮和解壓
          原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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實現了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 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];
              }
              
              //壓縮文件夾內的文件
              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文件
              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{
                              //如果指定文件的目錄不存在,則創建之.
                              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{
                  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 閱讀(1556) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 大宁县| 安阳市| 阿坝县| 拜城县| 六安市| 赞皇县| 东乌珠穆沁旗| 资中县| 永修县| 宣化县| 莱芜市| 张家界市| 庆阳市| 宝坻区| 永吉县| 英超| 北川| 安新县| 寻甸| 临洮县| 噶尔县| 临桂县| 星子县| 鸡泽县| 麻栗坡县| 濮阳市| 库车县| 红安县| 博野县| 内黄县| 昂仁县| 漠河县| 东兴市| 泽库县| 潞城市| 金湖县| 日照市| 荔浦县| 临澧县| 安化县| 荆州市|