benbenming

          使用Java核心類庫的zip包實現壓縮/解壓文件!

              由于需要,這幾天研究了一下使用Java技術實現文件及文件夾打zip包及解zip包,使用的是java.util.zip包下的類;主要用到的是三個類,即:ZipEntry,我的理解是zip文件中壓縮的一個個子文件;ZipInputStream是zip格式的輸入流;ZipOutputStream是zip格式的輸出流;
              這方面網上也有一些例子,我也測試了相關的例子,但是在實現部分功能是有些不足,所以將代碼改造后重寫如下,現在實現的功能是對單個文件的打包及解包,對一個文件夾(文件夾內文件及文件夾不限)的打包及解包;
              使用Java核心庫的不足就是如果對中文文件夾或文件打包后,文件名或文件夾名會出現亂碼,雖然在window下可以正常的解壓,解壓后也能正常顯示中文,但是對于Unix等系統則不具有通用性;網上能找的解決方式是使用Ant包中的zip類庫,Ant重寫了ZipOutputStream類,所以對于打包后正常顯示中文沒有問題,但是還是不能動態制定壓制zip文件的編碼;

            1import java.io.File;
            2import java.io.FileInputStream;
            3import java.io.FileNotFoundException;
            4import java.io.FileOutputStream;
            5import java.io.IOException;
            6import java.util.zip.ZipEntry;
            7import java.util.zip.ZipInputStream;
            8import java.util.zip.ZipOutputStream;
            9
           10/**
           11 * 使用java核心類庫打包、解包zip文件,不足之處在于壓縮中文名的文件時,在壓縮包內中文字符是亂碼,
           12 * 在windows下解壓后編碼正常顯示中文,而其他系統下則不能正常還原;
           13 */

           14public class TestZip {
           15
           16    /**
           17     * 定義壓縮文件及目錄為zip文件的方法,重寫下面的zip方法
           18     * 
           19     * @param zipFileName
           20     * @param inputFile
           21     * @throws Exception
           22     */

           23    public void zip(String zipFileName, String inputFile) {
           24        zip(zipFileName, new File(inputFile));
           25    }

           26
           27    /**
           28     * 定義壓縮文件及目錄為zip文件的方法,重寫下面的zip方法
           29     * 
           30     * @param zipFileName
           31     * @param inputFile
           32     * @throws Exception
           33     */

           34    public void zip(String zipFileName, File inputFile) {
           35        try {
           36            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
           37                    zipFileName));
           38            zip(out, inputFile, inputFile.getName());
           39            System.out.println("zip done");
           40            out.close();
           41        }

           42        catch (FileNotFoundException e) {
           43            // TODO 自動生成 catch 塊
           44            e.printStackTrace();
           45        }

           46        catch (IOException e) {
           47            // TODO 自動生成 catch 塊
           48            e.printStackTrace();
           49        }

           50    }

           51
           52    /**
           53     * 定義壓縮文件及目錄為zip文件的方法
           54     * 
           55     * @param out
           56     * @param f
           57     * @param base
           58     * @throws Exception
           59     */

           60    public void zip(ZipOutputStream out, File f, String base) {
           61        try {
           62            System.out.println("Zipping " + f.getName());
           63            //判斷File是否為目錄
           64            if (f.isDirectory()) {
           65                System.out.println("Read Directory !");
           66                //獲取f目錄下所有文件及目錄,作為一個File數組返回
           67                File[] fl = f.listFiles();
           68                out.putNextEntry(new ZipEntry(base + "/"));
           69                base = base.length() == 0 ? "" : base + "/";
           70                for (int i = 0; i < fl.length; i++{
           71                    zip(out, fl[i], base + fl[i].getName());
           72                }

           73            }

           74            else {
           75                System.out.println("Read File !");
           76                out.putNextEntry(new ZipEntry(base));
           77                FileInputStream in = new FileInputStream(f);
           78                int b;
           79                System.out.println("base " + base);
           80                while ((b = in.read()) != -1{
           81                    //                    System.out.println("File reading");
           82                    out.write(b);
           83                }

           84                in.close();
           85            }

           86        }

           87        catch (FileNotFoundException e) {
           88            // TODO 自動生成 catch 塊
           89            e.printStackTrace();
           90        }

           91        catch (IOException e) {
           92            // TODO 自動生成 catch 塊
           93            e.printStackTrace();
           94        }

           95    }

           96
           97    /**
           98     * 定義解壓縮zip文件的方法
           99     * 
          100     * @param zipFileName
          101     * @param outputDirectory
          102     */

          103    public void unzip(String zipFileName, String outputDirectory) {
          104        try {
          105            ZipInputStream in = new ZipInputStream(new FileInputStream(
          106                    zipFileName));
          107            //獲取ZipInputStream中的ZipEntry條目,一個zip文件中可能包含多個ZipEntry,
          108            //當getNextEntry方法的返回值為null,則代表ZipInputStream中沒有下一個ZipEntry,
          109            //輸入流讀取完成;
          110            ZipEntry z = in.getNextEntry();
          111            while (z != null{
          112                System.out.println("unziping " + z.getName());
          113                //創建以zip包文件名為目錄名的根目錄
          114                File f = new File(outputDirectory);
          115                f.mkdir();
          116                if (z.isDirectory()) {
          117                    String name = z.getName();
          118                    name = name.substring(0, name.length() - 1);
          119//                    System.out.println("name " + name);
          120                    f = new File(outputDirectory + File.separator + name);
          121                    f.mkdir();
          122//                    System.out.println("mkdir " + outputDirectory
          123//                            + File.separator + name);
          124                }

          125                else {
          126                    f = new File(outputDirectory + File.separator + z.getName());
          127                    f.createNewFile();
          128                    FileOutputStream out = new FileOutputStream(f);
          129                    int b;
          130                    while ((b = in.read()) != -1{
          131                        out.write(b);
          132                    }

          133                    out.close();
          134                }

          135                //讀取下一個ZipEntry
          136                z = in.getNextEntry();
          137            }

          138            in.close();
          139        }

          140        catch (FileNotFoundException e) {
          141            // TODO 自動生成 catch 塊
          142            e.printStackTrace();
          143        }

          144        catch (IOException e) {
          145            // TODO 自動生成 catch 塊
          146            e.printStackTrace();
          147        }

          148    }

          149
          150    public static void main(String[] args) {
          151        TestZip t = new TestZip();
          152//        t.zip("c:\\test11.zip", "c:\\test1");
          153//        t.zip("c:\\test2.zip", "c:\\php");
          154        t.unzip("c:\\test11.zip""c:\\test11");
          155        //如果此處不指定解壓的具體目錄,如:test2,那么則直接解壓到根目錄下
          156//        t.unzip("c:\\test2.zip", "c:\\test2");
          157    }

          158}

          posted on 2006-01-19 00:24 benbenming 閱讀(2784) 評論(0)  編輯  收藏 所屬分類: Java基礎


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


          網站導航:
           
          主站蜘蛛池模板: 平谷区| 峡江县| 呼伦贝尔市| 衢州市| 那曲县| 遂昌县| 汾阳市| 碌曲县| 汤原县| 日土县| 亳州市| 滁州市| 通山县| 天峻县| 泰兴市| 株洲县| 叙永县| 全州县| 丹棱县| 卢氏县| 石门县| 涞源县| 那曲县| 金寨县| 青田县| 清苑县| 秦安县| 建阳市| 共和县| 连江县| 大理市| 海门市| 皋兰县| 长垣县| 左贡县| 柞水县| 景泰县| 霍城县| 关岭| 孟连| 积石山|