1. 程式人生 > >Android端解壓zip檔案(包含中文目錄)

Android端解壓zip檔案(包含中文目錄)

這篇部落格不算原創,原作者的文章對我起到很大作用,我這裡就算是做個筆記,因為不滿足轉載的條件,所以也不算轉載。

好的,感謝原作者的技術分享,幾乎不需要更改什麼。感謝感謝,原文地址:點選開啟連結

上程式碼:

/**
   * 使用 org.apache.tools.zip.ZipFile 解壓檔案,它與 java 類庫中的
   * java.util.zip.ZipFile 使用方式是一新的,只不過多了設定編碼方式的
   * 介面。
   *
   * 注,apache 沒有提供 ZipInputStream 類,所以只能使用它提供的ZipFile
   * 來讀取壓縮檔案。
   * @param archive 壓縮包路徑
   * @param decompressDir 解壓路徑
   * @throws IOException
   * @throws FileNotFoundException
   * @throws ZipException
   */
            public static void readByApacheZipFile(String archive, String decompressDir) throws IOException, FileNotFoundException, ZipException {
                        BufferedInputStream bi;
                        ZipFile zf = new ZipFile(archive, "GBK");//支援中文
                        Enumeration e = zf.getEntries();
                        while (e.hasMoreElements()) {
                        ZipEntry ze2 = (ZipEntry) e.nextElement();
                        String entryName = ze2.getName();
                        String path = decompressDir + "/" + entryName;
                        if (ze2.isDirectory()) {
                        System.out.println("正在建立解壓目錄 - " + entryName);
                        File decompressDirFile = new File(path);
                        if (!decompressDirFile.exists()) {
                        decompressDirFile.mkdirs();
                        }
                        } else {
                        System.out.println("正在建立解壓檔案 - " + entryName);
                        String fileDir = path.substring(0, path.lastIndexOf("/"));
                        File fileDirFile = new File(fileDir);
                        if (!fileDirFile.exists()) {
                        fileDirFile.mkdirs();
                        }
                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(decompressDir + "/" + entryName));
                        bi = new BufferedInputStream(zf.getInputStream(ze2));
                        byte[] readContent = new byte[1024];
                        int readCount = bi.read(readContent);
                        while (readCount != -1) {
                        bos.write(readContent, 0, readCount);
                        readCount = bi.read(readContent);
                        }
                        bos.close();
                        }
                        }
                        zf.close();
             }

    /**
   * 使用 java api 中的 ZipInputStream 類解壓檔案,但如果壓縮時採用了
   * org.apache.tools.zip.ZipOutputStream時,而不是 java 類庫中的
   * java.util.zip.ZipOutputStream時,該方法不能使用,原因就是編碼方
   * 式不一致導致,執行時會拋如下異常:
   * java.lang.IllegalArgumentException
   * at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:290)
   *
   * 當然,如果壓縮包使用的是java類庫的java.util.zip.ZipOutputStream
   * 壓縮而成是不會有問題的,但它不支援中文
   *
   * @param archive 壓縮包路徑
   * @param decompressDir 解壓路徑
   * @throws FileNotFoundException
   * @throws IOException
   */
            public  void readByZipInputStream(String archive, String decompressDir) throws FileNotFoundException, IOException {
                    BufferedInputStream bi;
                    //----解壓檔案(ZIP檔案的解壓縮實質上就是從輸入流中讀取資料):
                    System.out.println("開始讀壓縮檔案");
                    FileInputStream fi = new FileInputStream(archive);
                    CheckedInputStream csumi = new CheckedInputStream(fi, new CRC32());
                    ZipInputStream in2 = new ZipInputStream(csumi);
                    bi = new BufferedInputStream(in2);
                    java.util.zip.ZipEntry ze;//壓縮檔案條目
                    //遍歷壓縮包中的檔案條目
                            while ((ze = in2.getNextEntry()) != null) {
                                    String entryName = ze.getName();
                                    if (ze.isDirectory()) {
                                    System.out.println("正在建立解壓目錄 - " + entryName);
                                    File decompressDirFile = new File(decompressDir + "/" + entryName);
                                    if (!decompressDirFile.exists()) {
                                    decompressDirFile.mkdirs();
                    }
                    } else {
                                System.out.println("正在建立解壓檔案 - " + entryName);
                                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(decompressDir + "/" + entryName));
                                byte[] buffer = new byte[1024];
                                int readCount = bi.read(buffer);
                                while (readCount != -1) {
                                bos.write(buffer, 0, readCount);
                                readCount = bi.read(buffer);
                            

                                }
                                bos.close();
                                }
                                }

                                bi.close();
                                System.out.println("Checksum: " + csumi.getChecksum().getValue());
            }