1. 程式人生 > >Android多種格式的非同步解壓/壓縮解決方案

Android多種格式的非同步解壓/壓縮解決方案

前言

最近由於專案需要,需要我諒解一下關於在移動平臺的解壓功能,在移動平臺解壓,我個人感覺是沒有太大必要的,畢竟手機的效能有限。但是,不口否認,移動端的解壓功能又是必備的,因為如果對於一些資源管理器類的應用,接入解壓功能,會更完全,例如:資源管理器、手機QQ、UC瀏覽器等一些列應用,涉及到檔案的管理與傳輸,那麼檢視壓縮包下的內容就會顯得十分必要了。所以說,如果有必要的話,移動應用還是需要支援的解壓的功能的。

壓縮檔案介紹

既然要解壓,那就必須先了解壓縮檔案,這篇文章只是初稿,所以這裡就先介紹幾種常見的壓縮檔案格式,以後會慢慢補充。

  1. zip格式,ZIP是一個計算機檔案的壓縮的演算法,原名Deflate(真空),發明者為菲利普·卡茲(Phil Katz)),他於1989年1月公佈了該格式的資料。ZIP通常使用字尾名“.zip”,它的MIME格式為 application/zip
     。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放原始碼的7-Zip格式。從效能上比較,RAR格式較ZIP格式壓縮率較高,但是它的壓縮時間遠遠高於Zip。而7-Zip由於提供了免費的壓縮工具而逐漸在更多的領域得到應用)。
  2. rar格式,同樣是無損資料壓縮,RAR檔案通常比[IP檔案壓縮比要高,但是壓縮速度較慢。因為RAR檔案頭也要佔據一定空間,在資料壓縮餘地不大時,壓縮過的檔案可能比原檔案要大。RAR的一個主要優點是可以把檔案壓縮目標分割到多個檔案,並且很容易從這樣的分割的壓縮檔案解壓出原始檔,其MIME格式為application/x-rar-compressed
  3. 7z格式
    ,7z 是一種主流高效的壓縮格式,它擁有極高的壓縮比。在電腦科學中,7z是一種可以使用多種壓縮演算法進行資料壓縮的檔案格式。該格式最初被7-Zip實現並採用,但是這種檔案格式是公有的,並且7-Zip軟體本身亦在GNU寬通用公共許可證(GNU LGPL)協議下開放原始碼。目前LZMA軟體開發工具包的最新版本為V9.34。7z格式的MIME型別為application/x-7z-compressed

解壓過程的顯示

具體來介紹下解壓各個格式的方法

  • zip格式,zip格式算是我們最常見的壓縮檔案格式,當然,也是最容易處理的壓縮格式,jdk本身就支援對zip檔案進行解壓,但是,jdk自帶的解壓畢竟有一定的侷限性,我們肯定可以有更好的解決方法來處理。
    經過對一些應用的反編譯,我發現他們很多用的並非是java.util.zip提供的解壓方法,如果是小的檔案,用這個其實也能夠處理,但是考慮到效能與效率,我決定尋找更合適的方法。
    zip4j

    zip4j是一個在java上比較好用的zip檔案壓縮解壓庫,其功能比較強大,支援壓縮與解壓、加密、更新、移除等一系列操作,感興趣的童鞋可以根據連結檢視相應地文件。既然是java平臺的庫,那麼放在移動端上來執行,我覺得是不會有太大問題的,畢竟zip解壓對機器的效能要求不是很高。
    看下我的demo中如何解壓zip檔案:

zip解壓的主要步驟


解壓過程是在一個執行緒裡執行,然後會通過handler回撥到ui執行緒中,通知相應地解壓進度以及相關資訊.
具體效果如下:

由此,zip檔案格式的解壓過程至此為止。

  • rar格式
    rar格式算是比較麻煩的一種格式之一,jdk是不帶rar格式的解壓的,所以只能夠實用開源的庫來進行解壓。說一下,rar格式由於壓縮演算法是不公開的,所以我們一般式不能夠來壓縮檔案,一般只有用於解壓的庫。經過探索,我找到一款效率較高的rar格式解壓庫,在Android上完全適用。
    java-unrar
    其主要解壓方式為:

rar解壓方式

其同回撥方法是和之前的一致的,所以有興趣的可以看我的demo。

  • 7z格式
    關於7z格式,才是過程最艱難的尋找。由於7z是一種高壓縮的格式,所以如果是用java程式碼來進行解壓,效率是十分低效的,所以我找了好幾款開源庫,都是利用c/c++程式碼打包成jar庫,然後進行解壓,那麼問題來了,如果是用動態庫的話,那麼機器的架構和平臺是有差異的,在windows和linux上適用,不一定對Android平臺能適用。因此,我一開始找到了
    7-Zip-JBinding
    這個開源庫是十分強大的,利用c++編寫的壓縮解壓演算法,對大部分平臺都有了對應的jar包,但是,唯獨對Android的就沒有很好的支援,我試著在把all-window包匯入專案,我就知道,果然報錯了。
    看了下編譯的結果,問題是由於這個庫的程式碼在編譯時,機器沒有足夠的記憶體以及效能來編譯,導致直接丟擲錯誤,我在stackoverflow上來尋找了下問題,發現記憶體問題解決了,但是又莫名其妙出了另一堆問題,我想這應該是平臺架構的問題了,估計我現在是解決不了了。
    不過,7-Zip-JBinding秉承了開源的精神,是提供了c的原始碼的,我們可以利用這些原始碼來進行jni的的開發,我發現在stackoverflow上還是有說這個解決方法的。
    有需要的朋友可以看一下stackoverflow這個問題:

所以用jbinding的想法是泡湯了,通過上述問題,我找到了andro7z 這個思路的解決方法,也是提供了相應地c程式碼,需要我們自己進行編譯ndk,打包成動態庫來執行。
但是我想有沒有更好的方法呢?
經過老大的指點,我找找到了一個github現成的工程AndroidUn7zip
作者已經做好了編譯並且打包成了動態庫和jar包,所以我們如果有需要的話,可直接把相應地庫下載下來就可以運行了:
具體使用方法如下:


核心程式碼

由於是採用的ndk的方法,所以我們比較難監聽解壓的過程,不過對於這種需要高效能的解壓的方法,我們也很難去新增進度。
而且作者還對其他的格式解壓也經行了封裝,可以使用同一個庫對不同的格式解壓的。

對於還有一種7z的解壓方法,就是利用compressor開源庫解壓,也可以在android上執行,但是實際使用過程中還是有點問題的,等以後有時間再寫具體的文章來說明。

結論

demo結構:


工程目錄


我覺得整個探究過程還是蠻有意思的,學到了許多以前沒有接觸到的知識,有時間我會把這個demo完善成一個解壓類庫,到時候就可以直接呼叫了,歡迎看一下我的這個解壓demo,希望有能力的可以完善這個demo。

相關推薦

Android多種格式非同步/壓縮解決方案

前言 最近由於專案需要,需要我諒解一下關於在移動平臺的解壓功能,在移動平臺解壓,我個人感覺是沒有太大必要的,畢竟手機的效能有限。但是,不口否認,移動端的解壓功能又是必備的,因為如果對於一些資源管理器類的應用,接入解壓功能,會更完全,例如:資源管理器、手機QQ、UC瀏覽器等一些列應用,涉及到檔案的管理與傳輸,那

Ubuntu 14.04上解決zip格式檔案檔名亂碼問題

大家在使用ubuntu(linux)系統中難免要解壓一些zip結尾的壓縮檔案,由於Windows與ubuntu作業系統的格式問題,所以使用unzip時難免解壓亂碼問題, 解決方法: 需要再安裝一個解壓工具:      sudo apt-get install unar 然

Linux 壓縮文件

article tar.bz2 detail net com tail gzip zip 總結 來源於:http://blog.csdn.net/mmllkkjj/article/details/6768294/ 解壓 tar –xvf file.tar //解壓

war 包 壓縮

-o 當前 bsp 嘗試 指定 大小 數字 壓縮 不包含 unzip project.war -d project這樣就在當前目錄下解壓project.war到project目錄裏面,參數-d的意思是創建project目錄附:unzip其它參數說明-x "文件列表" 解壓文

shell壓縮包,求包下所有文本的錄音時長總和

ase tdi tgz array net then arpa fun ucc #!/bin/bash#from為壓縮包批次所在目錄#basetarpath 為統計每批次總時長from=$1basetarpath=$2suffix="tgz"todir=

python壓縮包的幾種方法

打包工具 ESS rfi keyword 寫入 解壓 os.path gzip action python解壓壓縮包的幾種方法 .gz .tar .tgz .zip .rar 簡介 gz: 即gzip,通常只能壓縮一個文件。與tar結合起來就可以實

zip、tar格式檔案包相關指令

ZIP格式壓縮包: 解壓到特定目錄 # unzip [檔名].zip -d [目錄位置] 解壓到當前目錄 # unzip [檔名].zip 以ZIP格式壓縮檔案: # zip -r [檔名].zip [原檔案/目錄名] TAR.GZ格式壓縮包: 解壓到特定目錄 # tar -xzvf

VBA壓縮檔案。

VBA解壓壓縮檔案呼叫的是WinRAR的命令。我們可以參考WinRAR幫助。解壓檔案的命令以及例子如下圖: vba裡面使用shell執行命令。 程式碼很簡單如下: Sub jieya() Shell "D:\Program Files\WinRAR\WinRAR.exe X-Y

c# Byte,壓縮

using ICSharpCode.SharpZipLib.GZip; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Sys

linux 壓縮 常見命令

壓縮命令: .tar     tar -cvf 檔名稱.tar 檔案或者資料夾 .tar.gz     tar -zcvf 檔名稱.tar.gz 檔案或者資料夾 .tar.xz     tar -Jcf 檔名稱.tar.xz 檔案或者資料夾 .zip

壓縮包裡面的所有的壓縮檔案

mkdir train && mv ILSVRC2012_img_train.tar train/ && cd train tar -xvf ILSVRC2012_img_train.tar && mv ILSVRC2012_img_tra

python壓縮

import os import shutil def scan_file(): for f in os.listdir(): #程式執行檔案和需壓縮的檔案需同一目錄 if f.endswith('.zip'): return f def unzi

Linux下,壓縮JAR包的方法

把當前目錄下的所有檔案打包成project.jar jar -cvfM0 project.jar ./ -c   建立jar包 -v   顯示過程資訊 -f     -M -0   這個是阿拉伯數字,只打包不壓縮的意思 解壓project.jar jar -xvf

python-29 python壓縮包的幾種方法

這裡討論使用Python解壓例如以下五種壓縮檔案: .gz .tar  .tgz .zip .rar 簡單介紹 gz: 即gzip。通常僅僅能壓縮一個檔案。與tar結合起來就能夠實現先打包,再壓縮。 tar: linux系統下的打包工具。僅僅打包。不壓縮 tgz:即tar.gz。

linux 下所有格式打包方法(tar、bz2、rar)詳

01-.tar格式 解包:[*******]$ tar xvf FileName.tar 打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是壓縮!) 02-.gz格式 解壓1:[*******]$ gunzip FileName.gz 解壓2:[**

Linux下安裝zip壓縮功能

liunx伺服器上預設沒有安裝zip命令,所以使用時需安裝: apt-get install zip 或 yum install zip linux安裝unzip命令: apt-get install unzip 或 yum install unzip

哈夫曼編碼壓縮,,壓縮比,編碼表,儲存到檔案

//mian.c #include "FunctionReference.h" int main() { HuffmanTree HT; //哈夫曼樹 int sum; //統計的字元總數 int n;

壓縮命令

-c: 建立壓縮檔案 -x:解壓 -t:檢視內容 -r:向壓縮歸檔檔案末尾追加檔案 -u:更新原壓縮包中的檔案 這五個是獨立的命令,壓縮解壓都要用到其中一個,可以和別的命令連用但只能用其中一個。下面的引數是根據需要在壓縮或解壓檔案時可選的。 -z:有gzip屬性的 -j:有bz2屬性的 -Z:有compre

linux 壓縮命令 .tar/.gz/.bz2/……——持續跟新中

.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是壓縮!) ——————————————— .gz 解壓1:gunzip FileName.gz 解壓2:gzip -

Android studio 代碼突然報錯解決方案

cache dst roi image 技術分享 users 方案 file sdn 1.點擊File->Invalidate Caches / Restart... 2.重啟Gradle,清除緩存 3.Clean Project 4.關閉Android Stud