美文网首页临时专题(临时)Android知识Android开发
Android开发之旅-解压压缩zip文件(带子目录和中文路径)

Android开发之旅-解压压缩zip文件(带子目录和中文路径)

作者: 学海摆渡人 | 来源:发表于2016-09-26 21:13 被阅读2348次

    今天弄了一下午解压的问题,需求嘛,把自己踩过的坑记录下来,也为了跟我一样的新人少坑的路。

    怎么那么多的屁话,上代码啊!

    上解压的代码:

     //第一个参数就是需要解压的文件,第二个就是解压的目录
     public static boolean upZipFileDir(File zipFile, String folderPath) {
            ZipFile zfile= null;
            try {
                //转码为GBK格式,支持中文
                zfile = new ZipFile(zipFile,"GBK");
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            Enumeration zList=zfile.getEntries();
            ZipEntry ze=null;
            byte[] buf=new byte[1024];
            while(zList.hasMoreElements()){
                ze=(ZipEntry)zList.nextElement();
                //列举的压缩文件里面的各个文件,判断是否为目录
                if(ze.isDirectory()){
                    String dirstr = folderPath + ze.getName();
                    dirstr.trim();
                    File f=new File(dirstr);
                    f.mkdir();
                    continue;
                }
                OutputStream os= null;
                FileOutputStream fos = null;
                // ze.getName()会返回 script/start.script这样的,是为了返回实体的File
                File realFile = getRealFileName(folderPath, ze.getName());
                try {
                    fos = new FileOutputStream(realFile);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    return false;
                }
                os = new BufferedOutputStream(fos);
                InputStream is= null;
                try {
                    is = new BufferedInputStream(zfile.getInputStream(ze));
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
                int readLen=0;
                //进行一些内容复制操作
                try {
                    while ((readLen=is.read(buf, 0, 1024))!=-1) {
                        os.write(buf, 0, readLen);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
                try {
                    is.close();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            }
            try {
                zfile.close();
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        /**
         * 给定根目录,返回一个相对路径所对应的实际文件名.
         * @param baseDir 指定根目录
         * @param absFileName 相对路径名,来自于ZipEntry中的name
         * @return java.io.File 实际的文件
         */
        public 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];
                    ret=new File(ret, substr);
                }
    
                if(!ret.exists())
                    ret.mkdirs();
                substr = dirs[dirs.length-1];
                ret=new File(ret, substr);
                return ret;
            }else{
                ret = new File(ret,absFileName);
            }
            return ret;
        }
    

    记得别用系统提供的java.util.zip.ZipFile这个类,没办法支持中文的。
    去下载 ZipEntry.jar引用到项目中即可。

    相关文章

      网友评论

      • LBHE:ZipFile zfile = new ZipFile(zipFile,"GBK");请教一下大佬,在Android中通过以上代码解决解压文件中文乱码问题时,怎么一直报Call requires API level 24 (current min is 15)错,求指教。(PS:在eclipse上通过java没错误)
      • 废柴悦章:博主你好,请问ZipEntry.jar是在哪里下载的?具体叫什么名字?
        废柴悦章:@学海摆渡人 请问是org.apache.tools.zip这个吗?:blush:
        学海摆渡人:@废柴悦章 你QQ 多少
        学海摆渡人:@废柴悦章 百度一下就有。
      • 98a4b0bc93fb:应该不错, 先收藏起来
      • wordsMotivateme:哈哈
        学海摆渡人:邮箱多少,我私发给你。
        li123456: ZipEntry.jar哪里有下载的,有Demo吗
        ‘’
        学海摆渡人:@wordsMotivateme 谢谢

      本文标题:Android开发之旅-解压压缩zip文件(带子目录和中文路径)

      本文链接:https://www.haomeiwen.com/subject/ahnqyttx.html