码迷,mamicode.com
首页 > 移动开发 > 详细

Android自助餐之解析zip

时间:2016-06-21 07:52:30      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

Android自助餐之解析zip

获取文件的所有节点游标

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到指定目标路径)

  1. 获取并遍历每个节点
  2. 逐个处理节点
    • 如果节点是目录
      1. 获取该文件夹名称并拼接到目标路径后面
      2. 路径名转码
      3. 调用mkdir()创建该文件夹
    • 如果该节点是文件
      1. 根据节点名和指定路径名获取实际目标文件名
        1. /分割节点名字符串(除了最后一个外均为路径)
        2. 如果分割后字符串数组长度大于1,说明需要先创建文件夹
      2. 遍历分割后的字符串数组(除最后一个)并逐个拼接到目标解压路径后,将新的字符串转码并调用mkdirs()逐级创建文件夹
      3. 将最后一个字符串转码并拼接到刚才的路径字符串上并调用createNewFile()创建文件,此时已得到该节点的目标文件
      4. 根据目标文件创建输出流,根据节点创建输入流
      5. 从输入流读取数据复制到输出流,具体操作见[流操作][流操作]:http://blog.csdn.net/xmh19936688/article/details/50243997
  3. 关闭zip文件

直接用的代码

/**解压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;
}

Android自助餐之解析zip

标签:

原文地址:http://blog.csdn.net/xmh19936688/article/details/51694502

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!