• Android -- 压缩与解压文件


    我在做一个项目中,工程文件中有一个功能需要很多图片,图片与app一起打包下来的话有30+M,那么我们就考虑另外下载压缩包,我们将图片取出,工程就只有4+M了,哈哈哈哈,呵呵,真恐怖。那么这样就涉及到另外下载压缩包,以及压缩包的解压。

    java的工具类里面也包含的有对zip的处理。

    代码实现                                                                                      

    public class Util {
        public static final String ZIP_FILENAME = "/data/data/com.yydcdut.unzip/new_ios_7_icons_by_sunkotora-d68qbmo.zip";//需要解压缩的文件名  
        public static final String ZIP_DIR = "/data/data/com.yydcdut.unzip/";//需要压缩的文件夹  
        public static final String UN_ZIP_DIR = "/data/data/com.yydcdut.unzip/zzip/";//要解压的文件目录  
        //上面两个变量好像说反了。
        public static final int BUFFER = 1024 ;//缓存大小  
    
        /** 
         * zip压缩功能. 
         * 压缩baseDir(文件夹目录)下所有文件,包括子目录 
         * @throws Exception 
         */  
        public static void zipFile(String baseDir,String fileName) throws Exception{  
            List fileList=getSubFiles(new File(baseDir));  
            ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));  
            ZipEntry ze=null;  
            byte[] buf=new byte[BUFFER];  
            int readLen=0;  
            for(int i = 0; i <fileList.size(); i++) {  
                File f=(File)fileList.get(i);  
                ze=new ZipEntry(getAbsFileName(baseDir, f));  
                ze.setSize(f.length());  
                ze.setTime(f.lastModified());     
                zos.putNextEntry(ze);  
                InputStream is=new BufferedInputStream(new FileInputStream(f));  
                while ((readLen=is.read(buf, 0, BUFFER))!=-1) {  
                    zos.write(buf, 0, readLen);  
                }  
                is.close();  
            }  
            zos.close();  
        }  
    
        /** 
         * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径. 
         * @param baseDir java.lang.String 根目录 
         * @param realFileName java.io.File 实际的文件名 
         * @return 相对文件名 
         */  
        private static String getAbsFileName(String baseDir, File realFileName){  
            File real=realFileName;  
            File base=new File(baseDir);  
            String ret=real.getName();  
            while (true) {  
                real=real.getParentFile();  
                if(real==null)   
                    break;  
                if(real.equals(base))   
                    break;  
                else  
                    ret=real.getName()+"/"+ret;  
            }  
            return ret;  
        }  
    
        /** 
         * 取得指定目录下的所有文件列表,包括子目录. 
         * @param baseDir File 指定的目录 
         * @return 包含java.io.File的List 
         */  
        private static List getSubFiles(File baseDir){  
            List ret=new ArrayList();  
            File[] tmp=baseDir.listFiles();  
            for (int i = 0; i <tmp.length; i++) {  
                if(tmp[i].isFile())  
                    ret.add(tmp[i]);  
                if(tmp[i].isDirectory())  
                    ret.addAll(getSubFiles(tmp[i]));  
            }  
            return ret;  
        }  
    
        /** 
         * 解压缩功能. 
         * 将ZIP_FILENAME文件解压到ZIP_DIR目录下. 
         * @throws Exception 
         */  
        public static void upZipFile() throws Exception{  
            ZipFile zfile=new ZipFile(ZIP_FILENAME);  
            Enumeration zList=zfile.entries();  
            ZipEntry ze=null;  
            byte[] buf=new byte[1024];  
            while(zList.hasMoreElements()){  
                ze=(ZipEntry)zList.nextElement();         
                if(ze.isDirectory()){  
                    File f=new File(ZIP_DIR+ze.getName());  
                    f.mkdir();  
                    continue;  
                }  
                OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));  
                InputStream is=new BufferedInputStream(zfile.getInputStream(ze));  
                int readLen=0;  
                while ((readLen=is.read(buf, 0, 1024))!=-1) {  
                    os.write(buf, 0, readLen);  
                }  
                is.close();  
                os.close();   
            }  
            zfile.close();  
        }  
    
        /** 
         * 给定根目录,返回一个相对路径所对应的实际文件名. 
         * @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);  
            if(dirs.length>1){  
                for (int i = 0; i < dirs.length-1;i++) {  
                    ret=new File(ret, dirs[i]);  
                }  
                if(!ret.exists())  
                    ret.mkdirs();  
                ret=new File(ret, dirs[dirs.length-1]);  
                return ret;  
            }  
            return ret;  
        }  
    }

    代码分析                                                                                    

    先说解压,用ZipFile实例化压缩文件,接下来对ZipFile进行处理。列举出ZipFile中的元素,在用IO操作将ZipFile中的元素转化成文件,如果是目录,则创建目录继续操作。

    压缩,运用ZipOutputStream将文件转成IO输出流,再BufferedInputStream输入流写入进去。

    我是天王盖地虎的分割线                                                                

    源代码:http://pan.baidu.com/s/1dD1Qx01

    unzip.zip

    转载请注明出处:http://www.cnblogs.com/yydcdut

  • 相关阅读:
    小程序自定义组件(3)子向父传参
    postgresql插件安装
    二进制减法的实现
    mysql锁表问题
    mysql查看修改参数
    众数问题-找出超过一半的数
    只出现一次的数
    元素最大间距离
    第一个缺失数字
    局部最小值位置
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3813870.html
Copyright © 2020-2023  润新知