Android中文件的壓縮和解壓縮實(shí)例代碼
使用場(chǎng)景
當(dāng)我們?cè)趹?yīng)用的Assets目錄中需要加入文件時(shí),可以直接將源文件放入,但這樣會(huì)造成打包后的apk整體過(guò)大,此時(shí)就需要將放入的文件進(jìn)行壓縮.又如當(dāng)我們需要從服務(wù)器中下載文件時(shí),如果下載源文件耗時(shí)又消耗流量,較大文件需要壓縮,可以使得傳輸效率大大提高.下面我們就學(xué)習(xí)下基本的文件壓縮和解壓縮.Java中提供了壓縮和解壓縮的輸入輸出流
public static void zip(String src,String dest) throwsIOException { //定義壓縮輸出流 ZipOutputStreamout = null; try { //傳入源文件 File outFile= newFile(dest); File fileOrDirectory= newFile(src); //傳入壓縮輸出流 out = newZipOutputStream(newFileOutputStream(outFile)); //判斷是否是一個(gè)文件或目錄 //如果是文件則壓縮 if (fileOrDirectory.isFile()){ zipFileOrDirectory(out,fileOrDirectory, ""); } else { //否則列出目錄中的所有文件遞歸進(jìn)行壓縮 File[]entries = fileOrDirectory.listFiles(); for (int i= 0; i < entries.length;i++) { zipFileOrDirectory(out,entries,""); } } }catch(IOException ex) { ex.printStackTrace(); }finally{ if (out!= null){ try { out.close(); }catch(IOException ex) { ex.printStackTrace(); } } } } private static void zipFileOrDirectory(ZipOutputStream out, File fileOrDirectory, String curPath)throwsIOException { FileInputStreamin = null; try { //判斷目錄是否為null if (!fileOrDirectory.isDirectory()){ byte[] buffer= new byte[4096]; int bytes_read; in= newFileInputStream(fileOrDirectory); //歸檔壓縮目錄 ZipEntryentry = newZipEntry(curPath + fileOrDirectory.getName()); //將壓縮目錄寫到輸出流中 out.putNextEntry(entry); while ((bytes_read= in.read(buffer))!= -1) { out.write(buffer,0, bytes_read); } out.closeEntry(); } else { //列出目錄中的所有文件 File[]entries = fileOrDirectory.listFiles(); for (int i= 0; i < entries.length;i++) { //遞歸壓縮 zipFileOrDirectory(out,entries,curPath + fileOrDirectory.getName()+ "/"); } } }catch(IOException ex) { ex.printStackTrace(); }finally{ if (in!= null){ try { in.close(); }catch(IOException ex) { ex.printStackTrace(); } } } }
上述代碼存在問(wèn)題,若文件壓縮后仍然很大怎么辦,換句話說(shuō)文件壓縮率低也是問(wèn)題,java中也專門對(duì)Linux提供了高壓縮率的輸入輸出流,其使用方法和上述代碼相似.高壓縮率輸入輸出流:(GZIPInputStream和GZIPOutputStream)
文件壓縮
public static void zip(File srcFile, File desFile)throwsIOException { GZIPOutputStreamzos = null; FileInputStreamfis = null; try { //創(chuàng)建壓縮輸出流,將目標(biāo)文件傳入 zos = newGZIPOutputStream(newFileOutputStream(desFile)); //創(chuàng)建文件輸入流,將源文件傳入 fis = newFileInputStream(srcFile); byte[] buffer= new byte[1024]; int len= -1; //利用IO流寫入寫出的形式將源文件寫入到目標(biāo)文件中進(jìn)行壓縮 while ((len= (fis.read(buffer)))!= -1) { zos.write(buffer,0, len); } }finally{ close(zos); close(fis); } }
文件解壓縮
public static void unZip(File srcFile,File desFile) throws IOException { GZIPInputStream zis= null; FileOutputStreamfos = null; try { //創(chuàng)建壓縮輸入流,傳入源文件 zis = new GZIPInputStream(newFileInputStream(srcFile)); //創(chuàng)建文件輸出流,傳入目標(biāo)文件 fos = newFileOutputStream(desFile); byte[] buffer= new byte[1024]; int len= -1; //利用IO流寫入寫出的形式將壓縮源文件解壓到目標(biāo)文件中 while ((len= (zis.read(buffer)))!= -1) { fos.write(buffer,0, len); } }finally{ close(zis); close(fos); } }
以上所述是小編給大家介紹的Android中文件的壓縮和解壓縮實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android上傳文件到Web服務(wù)器 PHP接收文件
這篇文章主要為大家詳細(xì)介紹了Android上傳文件到Web服務(wù)器,PHP接收文件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android拍照保存在系統(tǒng)相冊(cè)不顯示的問(wèn)題解決方法
我們保存相冊(cè)到Android手機(jī)的時(shí)候,然后去打開(kāi)系統(tǒng)圖庫(kù)找不到我們想要的那張圖片,那是因?yàn)槲覀儾迦氲膱D片還沒(méi)有更新的緣故,下面與大家分享下此問(wèn)題的解決方法2013-06-06Android編程簡(jiǎn)單實(shí)現(xiàn)雷達(dá)掃描效果
這篇文章主要介紹了Android編程簡(jiǎn)單實(shí)現(xiàn)雷達(dá)掃描效果,涉及Android圖形繪制及顯示的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android客戶端與服務(wù)端數(shù)據(jù)加密傳輸方案詳解
這篇文章主要為大家介紹了Android客戶端與服務(wù)端數(shù)據(jù)加密傳輸方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android GSYVideoPlayer視頻播放器功能的實(shí)現(xiàn)
這篇文章主要介紹了Android GSYVideoPlayer視頻播放器功能的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03詳解Android Service 使用時(shí)的注意事項(xiàng)
這篇文章主要介紹了詳解Android Service 使用時(shí)的注意事項(xiàng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10