利用java的ZipOutputStream類解壓/解壓縮檔案或檔案夾中的檔案

來源:互聯網
上載者:User

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import java.util.zip.GZIPInputStream;
import java.io.DataInputStream;

public class Zips {
        /**
         * zip壓縮功能測試. 將d:\\temp\\zipout目錄下的所有檔案連同子目錄壓縮到d:\\temp\\out.zip.
         *
         * @param baseDir 所要壓縮的目錄名(包含絕對路徑)
         * @param objFileName 壓縮後的檔案名稱
         * @throws Exception
         */
        public void createZip(String baseDir, String objFileName) throws Exception {
                File folderObject = new File(baseDir);
                if (folderObject.exists()){
                        List fileList = getSubFiles(new File(baseDir));

                        //壓縮檔名
                        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFileName));

                        ZipEntry ze = null;
                        byte[] buf = new byte[1024];
                        int readLen = 0;
                        for (int i = 0; i < fileList.size(); i++) {
                                File f = (File) fileList.get(i);
                                System.out.println("Adding: " + f.getPath() + f.getName());

                                //建立一個ZipEntry,並設定Name和其它的一些屬性
                                ze = new ZipEntry(getAbsFileName(baseDir, f));
                                ze.setSize(f.length());
                                ze.setTime(f.lastModified());

                                //將ZipEntry加到zos中,再寫入實際的檔案內容
                                zos.putNextEntry(ze);
                                InputStream is = new BufferedInputStream(new FileInputStream(f));
                                while ((readLen = is.read(buf, 0, 1024)) != -1) {
                                        zos.write(buf, 0, readLen);
                                }
                                is.close();
                                System.out.println("done...");
                        }
                        zos.close();
                }else{
                        throw new Exception("this folder isnot exist!");
                }
        }
        /**
         * zip壓縮功能測試. 將指定檔案壓縮後存到一壓縮檔中
         *
         * @param baseDir 所要壓縮的檔案名稱
         * @param objFileName 壓縮後的檔案名稱
         * @return 壓縮後檔案的大小
         * @throws Exception
         */
        public long createFileToZip(String zipFilename,String sourceFileName) throws Exception {

                File sourceFile = new File(sourceFileName);
                byte[] buf = new byte[1024];

                //壓縮檔名
                File objFile = new File(zipFilename);
                ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));
                ZipEntry ze = null;
               
                //建立一個ZipEntry,並設定Name和其它的一些屬性
                ze = new ZipEntry(sourceFile.getName());
                ze.setSize(sourceFile.length());
                ze.setTime(sourceFile.lastModified());

                //將ZipEntry加到zos中,再寫入實際的檔案內容
                zos.putNextEntry(ze);
                InputStream is = new BufferedInputStream(new FileInputStream(sourceFile));
                int readLen = -1;
                while ((readLen = is.read(buf, 0, 1024)) != -1) {
                        zos.write(buf, 0, readLen);
                }
                is.close();
                zos.close();
                return objFile.length();
        }
        /**
         * 測試解壓縮功能. 將d:\\download\\test.zip連同子目錄解壓到d:\\temp\\zipout目錄下.
         *
         * @throws Exception
         */
        public void releaseZipToFile(String sourceZip, String outFileName)throws IOException{
                      ZipFile zfile=new ZipFile(sourceZip);
                      System.out.println(zfile.getName());
                      Enumeration zList=zfile.entries();
                      ZipEntry ze=null;
                      byte[] buf=new byte[1024];
                      while(zList.hasMoreElements()){
                      //從ZipFile中得到一個ZipEntry
                      ze=(ZipEntry)zList.nextElement();
                      if(ze.isDirectory()){
                      continue;
                      }
                      //以ZipEntry為參數得到一個InputStream,並寫到OutputStream中
                      OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(outFileName, ze.getName())));
                      InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
                      int readLen=0;
                      while ((readLen=is.read(buf, 0, 1024))!=-1) {
                      os.write(buf, 0, readLen);
                      }
                      is.close();
                      os.close();
                      System.out.println("Extracted: "+ze.getName());
                      }
                      zfile.close();
        }
        /**
         * 取得指定目錄下的所有檔案清單,包括子目錄.
         *
         * @param baseDir
         *            File 指定的目錄
         * @return 包含java.io.File的List
         */
        private List getSubFiles(File baseDir) {
                List ret = new ArrayList();
                //File base=new File(baseDir);
                File[] tmp = baseDir.listFiles();
                for (int i = 0; i < tmp.length; i++) {
                        if (tmp[i].isFile()) {
                                ret.add(tmp[i]);
                        }
                        if (tmp[i].isDirectory()) {
                                ret.addAll(getSubFiles(tmp[i]));
                        }
                }
                return ret;
        }
        /**
         * 給定根目錄,返回一個相對路徑所對應的實際檔案名稱.
         *
         * @param baseDir
         *            指定根目錄
         * @param absFileName
         *            相對路徑名,來自於ZipEntry中的name
         * @return java.io.File 實際的檔案
         */
        private File getRealFileName(String baseDir, String absFileName) {
                String[] dirs = absFileName.split("/");
                //System.out.println(dirs.length);
                File ret = new File(baseDir);
                //System.out.println(ret);
                if (dirs.length > 1) {
                        for (int i = 0; i < dirs.length - 1; i++) {
                                ret = new File(ret, dirs[i]);
                        }
                }
                if (!ret.exists()) {
                        ret.mkdirs();
                }
                ret = new File(ret, dirs[dirs.length - 1]);
                return ret;
        }
        /**
         * 給定根目錄,返回另一個檔案名稱的相對路徑,用於zip檔案中的路徑.
         *
         * @param baseDir
         *            java.lang.String 根目錄
         * @param realFileName
         *            java.io.File 實際的檔案名稱
         * @return 相對檔案名稱
         */
        private String getAbsFileName(String baseDir, File realFileName) {
                File real = realFileName;
                File base = new File(baseDir);
                String ret = real.getName();
                while (true) {
                        real = real.getParentFile();
                        if (real == null)
                                break;
                        if (real.equals(base))
                                break;
                        else {
                                ret = real.getName() + "/" + ret;
                        }
                }
                System.out.println("K " + ret);
                return ret;
        }

     public static void main(String args[]){
     Zips manager = new Zips();
     try {
//   manager.createFileToZip("d:\\temp\\out.zip","");
       manager.releaseZipToFile("d:\\temp\\out.zip","d:\\test");
       //manager.createZip("d:\\temp\\zipout","d:\\temp\\out.zip");
     }
     catch (Exception e) {
    e.printStackTrace();
     }
     System.out.println("END");
   }

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.