Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自助餐之解析zip

Android自助餐之解析zip

編輯:關於Android編程

目錄

獲取文件的所有節點游標
遍歷每個節點
處理一個節點
解壓文件思路(解壓某個ZipFile到指定目標路徑)
直接用的代碼

 

獲取文件的所有節點游標

Enumeration entries = zipFile.entries();//ZipFile為java.util.zip.ZipFile

遍歷每個節點

while(entries.hasMoreElements()){
    //do something
}

處理一個節點

ZipEntry ze = (ZipEntry)entries.nextElement();
boolean b = ze.isDirectory();//是否是目錄
String name = ze.getName();獲取文件/文件夾名稱
String name = new String(name.getBytes("8859_1"),"gb2312");//文件名轉碼
InputStream is = new BufferedInputStream(zipFile.getInputStream(ze));//從該節點獲取輸入流(輸入到內存,ze必須不是目錄)
zipFile.close();//關閉zip文件

解壓文件思路(解壓某個ZipFile到指定目標路徑)

獲取並遍歷每個節點 逐個處理節點
如果節點是目錄
獲取該文件夾名稱並拼接到目標路徑後面 路徑名轉碼 調用mkdir()創建該文件夾 如果該節點是文件
根據節點名和指定路徑名獲取實際目標文件名
/分割節點名字符串(除了最後一個外均為路徑) 如果分割後字符串數組長度大於1,說明需要先創建文件夾 遍歷分割後的字符串數組(除最後一個)並逐個拼接到目標解壓路徑後,將新的字符串轉碼並調用mkdirs()逐級創建文件夾 將最後一個字符串轉碼並拼接到剛才的路徑字符串上並調用createNewFile()創建文件,此時已得到該節點的目標文件 根據目標文件創建輸出流,根據節點創建輸入流 從輸入流讀取數據復制到輸出流.

直接用的代碼

/**解壓zip文件到指定路徑*/
public static void unpackZipFile(ZipFile zipFile,String folderPath) {
    Enumeration entries = zipFile.entries();
    ZipEntry ze=null;
    byte[] buf=new byte[1024];
    //遍歷節點
    while (entries.hasMoreElements()){
        ze= (ZipEntry) entries.nextElement();
        //region 該節點是目錄
        if(ze.isDirectory()){
            String dirstr= folderPath+ze.getName();//獲取文件夾名稱
            try {
                //創建文件夾
                dirstr=new String(dirstr.getBytes("8859_1"),"gb2312");
                File f=new File(dirstr);
                f.mkdir();
            }catch (Exception e){
                e.printStackTrace();
            }
            continue;
        }
        //endregion
        //region 該節點是文件
        try {
            //創建IO流復制文件
            OutputStream os = new BufferedOutputStream(new FileOutputStream(getRealFileName(folderPath, ze.getName())));
            InputStream is = new BufferedInputStream(zipFile.getInputStream(ze));
            int readLen=0;
            while ((readLen=is.read(buf,0,1024))!=-1){
                os.write(buf,0,readLen);
            }
            is.close();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //endregion
    }
    //關閉文件
    try {
        zipFile.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**根據相對路徑獲取並創建絕對路徑*/
private static File getRealFileName(String baseDir,String absFileName){
    String[] dirs=absFileName.split("/");//獲取逐級相對路徑
    File ret=new File(baseDir);//用於記錄每一級路徑
    String substr=null;
    if(dirs.length>1) {
        //循環遍歷不包括最後一個節點,因為該節點不是路徑,獨立處理
        for (int i = 0; i < dirs.length - 1; i++) {
            substr = dirs[i];
            try {
                substr = new String(substr.getBytes("8859_1"), "gb2312");
            } catch (Exception e) {
                e.printStackTrace();
            }
            ret = new File(ret, substr);//記錄該級路徑
        }
        //創建每級目錄
        if (!ret.exists()) {
            ret.mkdirs();
        }
    }
    //處理最後一個節點
    substr=dirs[dirs.length-1];
    try{
        substr=new String(substr.getBytes("8859_1"),"gb2312");
    }catch (Exception e){
        e.printStackTrace();
    }
    ret=new File(ret,substr);
    if(!ret.exists()){
        try {
            ret.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return ret;
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved