Android多種格式的非同步解壓/壓縮解決方案
前言
最近由於專案需要,需要我諒解一下關於在移動平臺的解壓功能,在移動平臺解壓,我個人感覺是沒有太大必要的,畢竟手機的效能有限。但是,不口否認,移動端的解壓功能又是必備的,因為如果對於一些資源管理器類的應用,接入解壓功能,會更完全,例如:資源管理器、手機QQ、UC瀏覽器等一些列應用,涉及到檔案的管理與傳輸,那麼檢視壓縮包下的內容就會顯得十分必要了。所以說,如果有必要的話,移動應用還是需要支援的解壓的功能的。
壓縮檔案介紹
既然要解壓,那就必須先了解壓縮檔案,這篇文章只是初稿,所以這裡就先介紹幾種常見的壓縮檔案格式,以後會慢慢補充。
- zip格式,ZIP是一個計算機檔案的壓縮的演算法,原名Deflate(真空),發明者為菲利普·卡茲(Phil Katz)),他於1989年1月公佈了該格式的資料。ZIP通常使用字尾名“.zip”,它的MIME格式為 application/zip
。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放原始碼的7-Zip格式。從效能上比較,RAR格式較ZIP格式壓縮率較高,但是它的壓縮時間遠遠高於Zip。而7-Zip由於提供了免費的壓縮工具而逐漸在更多的領域得到應用)。- rar格式,同樣是無損資料壓縮,RAR檔案通常比[IP檔案壓縮比要高,但是壓縮速度較慢。因為RAR檔案頭也要佔據一定空間,在資料壓縮餘地不大時,壓縮過的檔案可能比原檔案要大。RAR的一個主要優點是可以把檔案壓縮目標分割到多個檔案,並且很容易從這樣的分割的壓縮檔案解壓出原始檔,其MIME格式為application/x-rar-compressed。
- 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是一個在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