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
zip4j是一个在java上比较好用的zip文件压缩解压库,其功能比较强大,支持压缩与解压、加密、更新、移除等一系列操作,感兴趣的童鞋可以根据链接查看相应地文档。既然是java平台的库,那么放在移动端上来运行,我觉得是不会有太大问题的,毕竟zip解压对机器的性能要求不是很高。
看下我的demo中如何解压zip文件:
解压过程是在一个线程里运行,然后会通过handler回调到ui线程中,通知相应地解压进度以及相关信息.
具体效果如下:
由此,zip文件格式的解压过程至此为止。
- rar格式
rar格式算是比较麻烦的一种格式之一,jdk是不带rar格式的解压的,所以只能够实用开源的库来进行解压。说一下,rar格式由于压缩算法是不公开的,所以我们一般式不能够来压缩文件,一般只有用于解压的库。经过探索,我找到一款效率较高的rar格式解压库,在Android上完全适用。
java-unrar
其主要解压方式为:
其同回调方法是和之前的一致的,所以有兴趣的可以看我的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这个问题:http://stackoverflow.com/questions/14024874/j7zip-on-Android-extracting-from-an-archive-and-listing-contents/14676769#14676769
所以用jbinding的想法是泡汤了,通过上述问题,我找到了andro7z 这个思路的解决方法,也是提供了相应地c代码,需要我们自己进行编译ndk,打包成动态库来执行。
但是我想有没有更好的方法呢?
经过老大的指点,我找找到了一个github现成的工程AndroidUn7zip
作者已经做好了编译并且打包成了动态库和jar包,所以我们如果有需要的话,可直接把相应地库下载下来就可以运行了:
具体使用方法如下:
由于是采用的ndk的方法,所以我们比较难监听解压的过程,不过对于这种需要高性能的解压的方法,我们也很难去添加进度。
而且作者还对其他的格式解压也经行了封装,可以使用同一个库对不同的格式解压的。
https://github.com/hzy3774/AndroidP7zip
真心感谢老大和作者的指导。
对于还有一种7z的解压方法,就是利用compressor开源库解压,也可以在android上运行,但是实际使用过程中还是有点问题的,等以后有时间再写具体的文章来说明。
结论
demo结构:
我觉得整个探究过程还是蛮有意思的,学到了许多以前没有接触到的知识,有时间我会把这个demo完善成一个解压类库,到时候就可以直接调用了,欢迎看一下我的这个解压demo,希望有能力的可以完善这个demo。
原文地址:http://www.jianshu.com/p/339ab9048f91
Android多种格式的异步解压/压缩解决方案的更多相关文章
- Linux 解压/压缩xxx.zip格式(unZip Zip的安装和使用)
Linux系统没有自带的压缩解压工具:需要我们自己安装:当压缩包为.zip格式时,需要安装zip包 1.apt-get安装: apt-get install zip 2.yum安装: yum inst ...
- Android之zip文件加密解压及进度条的实现
zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件 ...
- centos7 tar.xz格式文件的解压方法
现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件格式. 和gzip与bzip2一样,同样支持多文件压缩,但是约定不能将多于一个的目标文件压缩进同一个档案 ...
- 各种格式的压缩包解压,7zip 命令行
由于7z.exe所在路径,以及解压目录中可能包含中文特殊字符,导致解压失败,所以最好将各部分路径使用双引号包含起来. 如:CString str; str.Format(L"\"% ...
- Linux 解压 压缩 tar
tar 格式:tar [选项] 目录或文件 // 将 test 文件夹打包成 test.tar $ tar cvf test.tar test // 将 home 目录下的 test 文件夹打 ...
- Linux 解压压缩命令
一.概述: 1.压缩命令: 命令格式:tar -zcvf 压缩文件名.tar.gz 被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:t ...
- Linux tar.gz 、zip、rar 解压 压缩命令
tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...
- tar.xz格式文件的解压方法(转载)
转自:http://bbs.chinaunix.net/thread-3610738-1-1.html 现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件 ...
- [转]Linux下 tar.xz格式文件的解压方法
现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件格式. 和gzip与bzip2一样,同样支持多文件压缩,但是约定不能将多于一个的目标文件压缩进同一个档案 ...
随机推荐
- 纯CSS实现展开列表
效果预览 以下为源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- python网络编程(六)
tcp通信模型 tcp服务器 在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下: socket创建一个套接字 bind绑定ip和port listen使套接字变为可以被动链接 accept ...
- BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...
- ES6语法(一)let 和 const 命令
1.let命令 与 var 的区别 用法类似于var,但是所声明的变量,只在 let命令所在的代码块内有效. var 声明的变量可以在声明之前使用,值为 undefined ;let命令改变了语法行为 ...
- javascript中的常用表单事件用法
下面介绍几种javascript中常用的表单事件: 一,onsubmit:表单中的确认按钮被点击时发生的事件,如下案例. 案例解析:弹出表单中提交的内容 <form name="tes ...
- fzu1062 洗牌问题(思路模拟)
http://acm.fzu.edu.cn/problem.php?pid=1062 一开始想暴力找规律,没看出来..然后开始推,推测根据1再次返回第一个的时候顺序也复原,然后想以此推导出一个规律公式 ...
- 12、mysql补充
本篇导航: 视图 触发器 事务 存储过程 函数 流程控制 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可 ...
- 使用linux kernel代码编译perf工具
环境:Qemu + ARMv8 perf是一款综合性分析工具,大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别. 在内核源码目录下执行编译脚本: #!/bin/bash cross_com ...
- Unity设置播放模式下始终先执行指定的场景
通过我们使用Unity开发游戏,是在PC/Mac上.而一个游戏通常也会有很多的场景,比如A.B.C.D三个场景,正常流程下的执行顺序是 A –> B –> C –> D.在具体一点, ...
- mysql sql执行慢 分析过程
摘自: https://blog.csdn.net/zhuzaijava/article/details/77935200 为了验证select 1 与 select 1 from tableName ...