zoukankan      html  css  js  c++  java
  • 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这个问题:

      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

  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/wangfeng520/p/7065357.html
Copyright © 2011-2022 走看看