Android -- 壓縮與解壓文件

我在作一個項目中,工程文件中有一個功能須要不少圖片,圖片與app一塊兒打包下來的話有30+M,那麼咱們就考慮另外下載壓縮包,咱們將圖片取出,工程就只有4+M了,哈哈哈哈,呵呵,真恐怖。那麼這樣就涉及到另外下載壓縮包,以及壓縮包的解壓。java

java的工具類裏面也包含的有對zip的處理。ios

代碼實現                                                                                       緩存

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;  
    }  
}

代碼分析                                                                                     app

先說解壓,用ZipFile實例化壓縮文件,接下來對ZipFile進行處理。列舉出ZipFile中的元素,在用IO操做將ZipFile中的元素轉化成文件,若是是目錄,則建立目錄繼續操做。工具

壓縮,運用ZipOutputStream將文件轉成IO輸出流,再BufferedInputStream輸入流寫入進去。spa

我是天王蓋地虎的分割線                                                                 code

源代碼:http://pan.baidu.com/s/1dD1Qx01blog

unzip.zip圖片

 

 

 

轉載請註明出處:http://www.cnblogs.com/yydcdutip

相關文章
相關標籤/搜索