Android多种格式的异步解压/压缩解决方案

前言

最近因为项目须要,须要我谅解一下关于在移动平台的解压功能,在移动平台解压,我我的感受是没有太大必要的,毕竟手机的性能有限。可是,不口否定,移动端的解压功能又是必备的,由于若是对于一些资源管理器类的应用,接入解压功能,会更彻底,例如:资源管理器、手机QQ、UC浏览器等一些列应用,涉及到文件的管理与传输,那么查看压缩包下的内容就会显得十分必要了。因此说,若是有必要的话,移动应用仍是须要支持的解压的功能的。html

压缩文件介绍

既然要解压,那就必须先了解压缩文件,这篇文章只是初稿,因此这里就先介绍几种常见的压缩文件格式,之后会慢慢补充。java

  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线程中,通知相应地解压进度以及相关信息.
具体效果以下:linux

由此,zip文件格式的解压过程至此为止。android

  • rar格式
    rar格式算是比较麻烦的一种格式之一,jdk是不带rar格式的解压的,因此只可以实用开源的库来进行解压。说一下,rar格式因为压缩算法是不公开的,因此咱们通常式不可以来压缩文件,通常只有用于解压的库。通过探索,我找到一款效率较高的rar格式解压库,在Android上彻底适用。
    java-unrar
    其主要解压方式为:

rar解压方式

其同回调方法是和以前的一致的,因此有兴趣的能够看个人demo。c++

  • 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#14676769git

因此用jbinding的想法是泡汤了,经过上述问题,我找到了andro7z 这个思路的解决方法,也是提供了相应地c代码,须要咱们本身进行编译ndk,打包成动态库来执行。
可是我想有没有更好的方法呢?
通过老大的指点,我找找到了一个github现成的工程AndroidUn7zip
做者已经作好了编译而且打包成了动态库和jar包,因此咱们若是有须要的话,可直接把相应地库下载下来就能够运行了:
具体使用方法以下:github


核心代码

因为是采用的ndk的方法,因此咱们比较难监听解压的过程,不过对于这种须要高性能的解压的方法,咱们也很难去添加进度。
并且做者还对其余的格式解压也经行了封装,可使用同一个库对不一样的格式解压的。算法

https://github.com/hzy3774/AndroidP7zip
真心感谢老大和做者的指导。windows

对于还有一种7z的解压方法,就是利用compressor开源库解压,也能够在android上运行,可是实际使用过程当中仍是有点问题的,等之后有时间再写具体的文章来讲明。浏览器

结论

demo结构:


工程目录


我以为整个探究过程仍是蛮有意思的,学到了许多之前没有接触到的知识,有时间我会把这个demo完善成一个解压类库,到时候就能够直接调用了,欢迎看一下个人这个解压demo,但愿有能力的能够完善这个demo。

 

原文地址:http://www.jianshu.com/p/339ab9048f91

相关文章
相关标签/搜索