Android端解壓zip檔案(包含中文目錄)
阿新 • • 發佈:2018-12-30
這篇部落格不算原創,原作者的文章對我起到很大作用,我這裡就算是做個筆記,因為不滿足轉載的條件,所以也不算轉載。
好的,感謝原作者的技術分享,幾乎不需要更改什麼。感謝感謝,原文地址:點選開啟連結
上程式碼:
/** * 使用 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()); }