Android中簡單使用Zip

初次使用Zip的壓縮和解壓,只是簡單使用

1、android中Zip的壓縮:

  • Zip的壓縮主要用到了ZipOutputStream和ZipEntry類
  • 小例子如下:
public String zipFileOptions(){
    //創(chuàng)建壓縮文件的路徑
    String zipFileName = Environment.getExternalStorageDirectory() 
    + "/" + UUID.randomUUID().toString().replace("-", "") + ".zip";
    //創(chuàng)建壓縮的文件對象
    File zipFile = new File(zipFileName);
    //創(chuàng)建InputStream對象
    InputStream is = null;
    //創(chuàng)建ZipOutputStream對象
    ZipOutputStream zos = null;
    try{
        //獲取ZipOutputStream對象實(shí)例
        zos = new ZipOutputStream(new FileOutputStream(zipFile));
        zos.setComment("hello");
    }catch(FileNotFoundException e){
        e.printStackTrace();
    }
    //FileBean中保存有需要壓縮的文件的文件路徑换况,mFileList中保存了所有需要被壓縮的文件路徑
    for(FileBean bean : mFileList){
        //根據(jù)路徑,創(chuàng)建需要被壓縮的文件對象,bean.getUrlPath()獲取到的是文件的路徑
        File file = new File(bean.getUrlPath());
        try{
            //獲取輸入流對象
            is = new FileInputStream(file);
            zos.setNextEntry(new ZipEntry(file.getName()));
            byte[] buffer = new byte[8*1024];
            int length = 0;
            while((length=is.read(buffer))!=-1){
                //將文件寫進(jìn)壓縮流
                zos.write(buffer,0,length);
            }
            is.close(); 
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    try{
        zos.close();
    }catch(Exception e){
        e.printStackTrace();
    }
    return zipFileName;
}

注意:文件的壓縮相對來說比較耗費(fèi)時間,因此抵碟,不能在主線程中進(jìn)行操作,需要另起線程進(jìn)行操作坏匪,以上例子用到的是AsyncTask拟逮。

2、Zip的下載:

  • 下載文件用到了java原始的API适滓,在下載之前敦迄,首先需要獲得被下載文件的URL。
  • 然后自定義一個本地的文件路徑凭迹,用于裝載下載的Zip文件罚屋。
  • 然后在異步任務(wù)中進(jìn)行文件的下載。
  • 小例子如下:
/**
* 文件的下載方法
* @param url 文件的URL
* @param out 文件需要下載到的指定路徑目錄嗅绸,需要自定義創(chuàng)建該路徑
**/
public File downloadZipFile(String url,String out){

    //定義URL對象
    URL mURL = null;
    //定義File對象
    File mFile = null;
    //定義URLConnection對象
    URLConnection urlConnection = null;
    int byteCopies = 0;
    //定義FileOutputStream對象
    FileOutputStream mOutputFileStream = null;

    try{
        //創(chuàng)建URL實(shí)例
        mURL = new URL(url);
        //獲取文件的名稱
        String fileName = new File(mURL.getFile()).getName();
        //根據(jù)指定文件目錄和文件名稱來創(chuàng)建文件
        mFile = new File(out,fileName);

        //獲取URLConnection對象
        urlConnection = mURL.openConnection();
        //獲取文件的長度
        int length = urlConnection.getContentLength();

        //如果文件已經(jīng)存在
        if (mFile.exists()&&length==mFile.length) {
            return mFile;
        }

        //獲取FileOutputStream對象
        mOutputFileStream = new FileOutputStream(mFile);
        //獲取InputStream對象
        InputStream is = urlConnection.getInputStream();

        //設(shè)置緩沖區(qū)的大小
        byte[] buffer = new byte[8*1024];
        //創(chuàng)建BufferedInputStream對象
        BufferedInputStream bis = new BufferedInputStream(is,8*1024);
        //創(chuàng)建BufferedOutputStream對象
        BufferedOutputStream bos = new BufferedOutputStream(mOutputFileStream,8*1024);

        int n = 0;

        while((n = bis.read(buffer,0,8*1024)) != -1){
            bos.write(buffer,0,n);
        }
        //清空緩沖區(qū)
        bos.flush();

        return mFile;

    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try{
            bos.close();
            bis.close();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

    return null;

}

Zip的解壓:

  • 首先需要獲取到下載到的壓縮文件
  • 完了以后通過異步任務(wù)對文件進(jìn)行壓縮
  • 下面的小例子通過解壓出來的文件名稱脾猛,再加上指定的文件目錄來保存解壓出來的文件
  • 小例子:
/**
* 進(jìn)行文件解壓的方法
* @param file 下載回來的壓縮文件
**/
public List<File> unZipFile(File file){

    //創(chuàng)建集合,保存解壓出來的文件
    List<File> mFileList = new ArrayList<>();
    //定義解壓出來的文件對象
    File outFile = null;

    try{
        //創(chuàng)建ZipFile對象
        ZipFile mZipFile = new ZipFile(file);
        //創(chuàng)建ZipInputStream對象
        ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
        //創(chuàng)建ZipEntry對象
        ZipEntry zipEntry = null;
        //定義InputStream對象
        InputStream is = null;
        //定義OutputStream對象
        OutputStream os = null;

        while((zipEntry=zis.getNextEntry())!=null){
            //拼湊路徑朽砰,創(chuàng)建解壓出來的文件對象
            outFile = new File(Environment.getExternalStorageDirectory() 
                + "/vaeh" + File.separator + zipEntry.getName());

            //判斷父級目錄是否存在
            if (!outFile.getParentFile().exists()) {
                //創(chuàng)建父級目錄
                outFile.getParentFile().mkdir();
            }

            //判斷文件是否存在
            if (!outFile.exists()) {
                //創(chuàng)建文件
                outFile.createNewFile();
            }

            //獲取is的實(shí)例
            is = mZipFile.getInputStream(zipEntry);
            os = new FileOutputStream(outFile);

            //創(chuàng)建緩沖區(qū)
            byte[] buffer = new byte[8*1024];
            int length = 0;

            while((length=is.read(buffer))!=-1){
                os.write(buffer,0,length);
            }
            //這里加多一次判斷是為了保險起見尖滚,防止出現(xiàn)空指針
            if (outFile.exists()) {
                //將文件保存到集合中
                mFileList.add(outFile);
            }
            is.close();
            os.close();
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    return mFileList;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞧柔,隨后出現(xiàn)的幾起案子漆弄,更是在濱河造成了極大的恐慌,老刑警劉巖造锅,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撼唾,死亡現(xiàn)場離奇詭異,居然都是意外死亡哥蔚,警方通過查閱死者的電腦和手機(jī)倒谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蛛蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渤愁,你說我怎么就攤上這事牵祟。” “怎么了抖格?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵诺苹,是天一觀的道長。 經(jīng)常有香客問我雹拄,道長收奔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任滓玖,我火速辦了婚禮坪哄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘势篡。我一直安慰自己翩肌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布殊霞。 她就那樣靜靜地躺著摧阅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绷蹲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天顾孽,我揣著相機(jī)與錄音祝钢,去河邊找鬼。 笑死若厚,一個胖子當(dāng)著我的面吹牛拦英,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测秸,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼疤估,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了霎冯?” 一聲冷哼從身側(cè)響起铃拇,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沈撞,沒想到半個月后慷荔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缠俺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年显晶,在試婚紗的時候發(fā)現(xiàn)自己被綠了贷岸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡磷雇,死狀恐怖偿警,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唯笙,我是刑警寧澤螟蒸,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站睁本,受9級特大地震影響尿庐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呢堰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一抄瑟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枉疼,春花似錦皮假、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至航闺,卻和暖如春褪测,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潦刃。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工侮措, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乖杠。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓分扎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胧洒。 傳聞我的和親對象是個殘疾皇子畏吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法卫漫,內(nèi)部類的語法菲饼,繼承相關(guān)的語法,異常的語法汛兜,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理巴粪,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,805評論 0 11
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程肛根,因...
    小菜c閱讀 6,367評論 0 17
  • 這劇都完結(jié)大半年了辫塌,然后前兩天想起來要畫這對,畫完再P回劇照派哲,是不起很好玩呀臼氨,哈哈 原圖 鬼怪的小新娘 鬼怪先森 ...
    ipromiseido閱讀 1,604評論 17 34