posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Zip解壓縮[轉(zhuǎn)]

          Posted on 2007-09-02 17:43 semovy 閱讀(724) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA應(yīng)用

          需要的Ant.jar包
          package com.semovy.test;
          /*
          調(diào)用org.apache.tools.zip實(shí)現(xiàn)壓縮。
          夜可以使用java.util.zip不過如果是中文的話,
          解壓縮的時(shí)候文件名字會(huì)是亂碼。原因是解壓縮軟件的編碼格式跟
          java.util.zip.ZipInputStream的編碼字符集不同
          java.util.zip.ZipInputStream的字符集固定是UTF-8

          注銷的部分是解壓縮的代碼。
          */
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.InputStream;

          import org.apache.tools.zip.ZipEntry;
          import org.apache.tools.zip.ZipFile;
          import org.apache.tools.zip.ZipOutputStream;

          /*
          * @作者:張華 @日期:2006-5-14 @說明:
          */
          public class ZipUtil {

          public void zip(String zipFileName, String inputFile) throws Exception {
           zip(zipFileName, new File(inputFile));
          }

          public void zip(String zipFileName, File inputFile) throws Exception {
           ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
             new String(zipFileName.getBytes("gb2312"))));
           System.out.println("zip start");
           zip(out, inputFile, "");
           System.out.println("zip done");
           out.close();
          }

          public void zip(ZipOutputStream out, File f, String base) throws Exception {
           System.out.println("Zipping  " + f.getName());
           if (f.isDirectory()) {
            File[] fl = f.listFiles();
            //out.putNextEntry(new ZipEntry(base + "/"));
            out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
            base = base.length() == 0 ? "" : base + "/";
            for (int i = 0; i < fl.length; i++) {
             zip(out, fl[i], base + fl[i].getName());
             System.out.println(fl[i].getName());
             //System.out.println(new String(fl[i].getName().getBytes("gb2312")));
            }
           } else {
            //out.putNextEntry(new ZipEntry(base));
            out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
            System.out.println(base);
            FileInputStream in = new FileInputStream(f);
            int b;

            while ((b = in.read()) != -1)
             out.write(b);
            in.close();
           }

          }

          private void createDirectory(String directory, String subDirectory) {
           String dir[];
           File fl = new File(directory);
           try {
            if (subDirectory == "" && fl.exists() != true)
             fl.mkdir();
            else if (subDirectory != "") {
             dir = subDirectory.replace('\\', '/').split("/");
             for (int i = 0; i < dir.length; i++) {
              File subFile = new File(directory + File.separator + dir[i]);
              if (subFile.exists() == false)
               subFile.mkdir();
              directory += File.separator + dir[i];
             }
            }
           } catch (Exception ex) {
            System.out.println(ex.getMessage());
           }
          }

          public void unZip(String zipFileName, String outputDirectory)
            throws Exception {
           try {
            ZipFile zipFile = new ZipFile(zipFileName);
            java.util.Enumeration e = zipFile.getEntries();
            ZipEntry zipEntry = null;
            createDirectory(outputDirectory, "");
            while (e.hasMoreElements()) {
             zipEntry = (ZipEntry) e.nextElement();
             System.out.println("正在解壓: " + zipEntry.getName());
             String name= null;
             if (zipEntry.isDirectory()) {
              name = zipEntry.getName();
              name = name.substring(0, name.length() - 1);
              File f = new File(outputDirectory + File.separator + name);
              f.mkdir();
              System.out.println("創(chuàng)建目錄:" + outputDirectory + File.separator + name);
             } else {
              String fileName = zipEntry.getName();
              fileName = fileName.replace('\\', '/');
              // System.out.println("測(cè)試文件1:" +fileName);
              if (fileName.indexOf("/") != -1) {
               createDirectory(outputDirectory, fileName.substring(0,fileName.lastIndexOf("/")));
               fileName = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
              }

              File f = new File(outputDirectory + File.separator + zipEntry.getName());

              f.createNewFile();
              InputStream in = zipFile.getInputStream(zipEntry);
              FileOutputStream out = new FileOutputStream(f);

              byte[] by = new byte[1024];
              int c;
              while ((c = in.read(by)) != -1) {
               out.write(by, 0, c);
              }
              out.close();
              in.close();
             }
            
            }
           
            //刪除文件不能在這里刪,因?yàn)槲募谑褂茫瑧?yīng)在上傳那處刪
          //  解壓后,刪除壓縮文件
          //  File zipFileToDel = new File(zipFileName);
          //  zipFileToDel.delete();
          //  System.out.println("正在刪除文件:"+ zipFileToDel.getCanonicalPath());
           
          //  //刪除解壓后的那一層目錄
          //  delALayerDir(zipFileName, outputDirectory);
           
           } catch (Exception ex) {
            System.out.println(ex.getMessage());
           }

          }

          /**
           * 刪掉一層目錄
           * @param zipFileName
           * @param outputDirectory
           */
          public void delALayerDir(String zipFileName, String outputDirectory) {

           String[] dir = zipFileName.replace('\\', '/').split("/");
           String fileFullName = dir[dir.length - 1]; //得到aa.zip
           int pos = -1;
           pos = fileFullName.indexOf(".");
           String fileName = fileFullName.substring(0, pos); //得到aa
           String sourceDir = outputDirectory + File.separator + fileName;
           try {
            copyFile(new File(outputDirectory), new File(sourceDir), new File(sourceDir));

            deleteSourceBaseDir(new File(sourceDir));

           } catch (Exception e) {
            e.printStackTrace();
           }
          }

          /**
           * 將sourceDir目錄的文件全部copy到destDir中去
           */
          public void copyFile(File destDir, File sourceBaseDir, File sourceDir)
            throws Exception {

           File[] lists = sourceDir.listFiles();
           String line = null;
           String url = null;
           if(lists == null)
            return;
           for (int i = 0; i < lists.length; i++) {
            File f = lists[i];
            if (f.isFile()) {
             FileInputStream fis = new FileInputStream(f);
             String content = "";

             String sourceBasePath = sourceBaseDir.getCanonicalPath();
             String destPath = destDir.getCanonicalPath();
             String fPath = f.getCanonicalPath();
             String drPath = destDir
               + fPath.substring(fPath.indexOf(sourceBasePath)
                 + sourceBasePath.length());
             FileOutputStream fos = new FileOutputStream(drPath);

             byte[] b = new byte[2048];
             while (fis.read(b) != -1) {
              if (content != null)
               content += new String(b);
              else
               content = new String(b);
              b = new byte[2048];
             }

             content = content.trim();
             fis.close();

             fos.write(content.getBytes());
             fos.flush();
             fos.close();

            } else {
             //先新建目錄
             new File(destDir + File.separator + f.getName()).mkdir();

             copyFile(destDir, sourceBaseDir, f); //遞歸調(diào)用
            }
           }
          }

          /**
           * 將sourceDir目錄的文件全部copy到destDir中去
           */
          public void deleteSourceBaseDir(File curFile) throws Exception {

           File[] lists = curFile.listFiles();
           String line = null;
           String url = null;
           File parentFile = null;
           for (int i = 0; i < lists.length; i++) {
            File f = lists[i];
            if (f.isFile()) {
             f.delete();
             //若它的父目錄沒有文件了,說明已經(jīng)刪完,應(yīng)該刪除父目錄
             parentFile = f.getParentFile();
             if (parentFile.list().length == 0)
              parentFile.delete();
            } else {
             deleteSourceBaseDir(f); //遞歸調(diào)用
            }
           }
          }

          public static void main(String[] args) {
           try {
            ZipUtil t = new ZipUtil();
            t.zip("c:\\1.zip", "c:\\1\\");
            t.unZip("c:\\1.zip", "c:\\2\\");
           
           } catch (Exception e) {
            e.printStackTrace(System.out);
           }
          }

          }

           

           

          主站蜘蛛池模板: 巴里| 西林县| 涡阳县| 黄大仙区| 久治县| 香河县| 织金县| 汝城县| 贺州市| 辰溪县| 屯昌县| 古丈县| 丽水市| 铁岭市| 喀喇沁旗| 安溪县| 调兵山市| 吴忠市| 德州市| 沙湾县| 濮阳市| 库车县| 曲阜市| 临夏市| 南靖县| 富源县| 宝坻区| 德江县| 桓仁| 五寨县| 三门县| 临邑县| 松滋市| 宁乡县| 玉林市| 济源市| 四会市| 莱阳市| 鹤山市| 苏州市| 陈巴尔虎旗|