http://www.eoeandroid.com/forum.php?mod=viewthread&tid=167951
本文参与:eoe & 友盟Android开发原创教程大赛 所以大家多多支持!你们懂的。
java中实际是提供了对 zip等压缩格式的支持,但是为什么这里会用到ant呢?原因主要有两个:
1. java提供的类对于包括有中文字符的路径,文件名支持不够好,你用其它第三方软件解压的时候就会存在乱码。而ant.jar就支持文件名或者路径包括中文字符。
2. ant.jar提供了强大的工具类,更加方便于我们对压缩与解压的操作。
在去年十月份我写过一篇关于zip压缩与解压的帖子,只是简单的截了些图,上了源码,但是还不够完善,所以又把这一块的内容拿出来重新整理了一下,并且加入了对tar格式的支持。
帖子连接:
【Kris专题】利用antzip包来进行解压与压缩
随着Mobile行业的发展,软件的规模会越来越多,也会走pc上软件的模拟化的发展方向。比如更新的时候只是下载一些配置信息,或者是提供一些新鲜的资源到程序里面去。现在比较典型的就是换肤功能。在以前我也写过关于使用zip来实现换肤的帖子,看官有兴趣可以移步一下。呵呵
帖子连接:
【Kris专题】android 换肤
【kris专题】android 换肤(续)
其实对于ant.jar的应用,不管是 zip还是tar格式,大体都是差不多的,接一下我们讲解压缩或者是解压的时候我们都以zip格式来讲述,对于tar格式的应用,各位看官可以下载源码,导入项目,看看注释,如果有什么疑问可以一起探讨。
该教程的一个源码结构由三个activity(.AntZipActivity .UnzipActivity .DozipActivity)及两个工具类组成(TarUtil ZipUtil).由于有三个界面,所以对应layout里面有三个布局文件。另外当然少不重点中和重点,ant.jar包。
包视图:
<ignore_js_op>
第一个界面选择zip/tar格式,并选择是压缩还是解压,
<ignore_js_op>
解压界面,输入压缩包的路径,及解压到的目录,点击解压开始操作
<ignore_js_op>
压缩界面,输入需要压缩的目录,及压缩后的文件名,点击压缩开始操作
<ignore_js_op>
下面我们来看一下具体的关于zip的代码,先是解压的核心代码:
- /**
- * 解压指定zip文件
- * @param unZipfile 压缩文件的路径
- * @param destFile 解压到的目录
- */
- public void unZip(String unZipfile, String destFile) {// unZipfileName需要解压的zip文件名
- FileOutputStream fileOut;
- File file;
- InputStream inputStream;
- try {
- //生成一个zip的文件
- this.zipFile = new ZipFile(unZipfile);
- //遍历zipFile中所有的实体,并把他们解压出来
- for (@SuppressWarnings("unchecked")
- Enumeration<ZipEntry> entries = this.zipFile.getEntries(); entries
- .hasMoreElements();) {
- ZipEntry entry = entries.nextElement();
- //生成他们解压后的一个文件
- file = new File(destFile+File.separator+entry.getName());
- if (entry.isDirectory()) {
- file.mkdirs();
- } else {
- // 如果指定文件的目录不存在,则创建之.
- File parent = file.getParentFile();
- if (!parent.exists()) {
- parent.mkdirs();
- }
- //获取出该压缩实体的输入流
- inputStream = zipFile.getInputStream(entry);
- fileOut = new FileOutputStream(file);
- int length = 0;
- //将实体写到本地文件中去
- while ((length = inputStream.read(this.buf)) > 0) {
- fileOut.write(this.buf, 0, length);
- }
- fileOut.close();
- inputStream.close();
- }
- }
- this.zipFile.close();
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
接下来是压缩的核心代码:
- /**
- * 对传入的目录或者是文件进行压缩
- * @param srcFile 需要 压缩的目录或者文件
- * @param destFile 压缩文件的路径
- */
- public void doZip(String srcFile, String destFile) {// zipDirectoryPath:需要压缩的文件夹名
- File zipFile = new File(srcFile);
- try {
- //生成ZipOutputStream,会把压缩的内容全都通过这个输出流输出,最后写到压缩文件中去
- this.zipOut = new ZipOutputStream(new BufferedOutputStream(
- new FileOutputStream(destFile)));
- //设置压缩的注释
- zipOut.setComment("comment");
- //设置压缩的编码,如果要压缩的路径中有中文,就用下面的编码
- zipOut.setEncoding("GBK");
- //启用压缩
- zipOut.setMethod(ZipOutputStream.DEFLATED);
- //压缩级别为最强压缩,但时间要花得多一点
- zipOut.setLevel(Deflater.BEST_COMPRESSION);
- handleFile(zipFile, this.zipOut,"");
- //处理完成后关闭我们的输出流
- this.zipOut.close();
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
- /**
- * 由doZip调用,递归完成目录文件读取
- * @param zipFile
- * @param zipOut
- * @param dirName 这个主要是用来记录压缩文件的一个目录层次结构的
- * @throws IOException
- */
- private void handleFile(File zipFile, ZipOutputStream zipOut,String dirName) throws IOException {
- System.out.println("遍历文件:"+zipFile.getName());
- //如果是一个目录,则遍历
- if(zipFile.isDirectory())
- {
- File[] files = zipFile.listFiles();
- if (files.length == 0) {// 如果目录为空,则单独创建之.
- //只是放入了空目录的名字
- this.zipOut.putNextEntry(new ZipEntry(dirName+zipFile.getName()+File.separator));
- this.zipOut.closeEntry();
- } else {// 如果目录不为空,则进入递归,处理下一级文件
- for (File file : files) {
- // 进入递归,处理下一级的文件
- handleFile(file, zipOut, dirName+zipFile.getName()+File.separator);
- }
- }
- }
- //如果是文件,则直接压缩
- else
- {
- FileInputStream fileIn = new FileInputStream(zipFile);
- //放入一个ZipEntry
- this.zipOut.putNextEntry(new ZipEntry(dirName+zipFile.getName()));
- int length = 0;
- //放入压缩文件的流
- while ((length = fileIn.read(this.buf)) > 0) {
- this.zipOut.write(this.buf, 0, length);
- }
- //关闭ZipEntry,完成一个文件的压缩
- this.zipOut.closeEntry();
- }
- }
最后,关于tar的操作就不再详细的讲解了,看官们可以下载源码,导入工程,查看具体的方法,在操作的流程上与zip是一致的,但是比 zip的操作更简单一些,少了压缩的注释,压缩的一些参数。
最后的最后,源码来了。
<ignore_js_op> AntZip_src.zip (3.39 MB, 下载次数: 179)
接下来是测试的两个压缩包,一个是zip的压缩包(antzip.zip),一个是tar的压缩包(antzip.tar.zip,因为论坛不让上传tar格式的附件,所以我改名成了tar.zip,大家下载后得先把后面的zip去掉)。测试的时候将这两个包放到 sdcard目录下面,运行程序时先解压,再压缩。这样就可以不用修改程序里面的路径,如果不谦麻烦,可以自己修改路径进行测试。如有问题,欢迎拍砖!!
<ignore_js_op> antzip.zip (955.18 KB, 下载次数: 69)
<ignore_js_op> antzip.tar.zip (970 KB, 下载次数: 52)
最后最后的最后,还是如往常一样有一个楼主语,虽然上面说得够多了,但是还是得总结性来两句。
1.写这个教程时我遇到的一个问题。我在测试tar解压的时候,解压出来的文件始终不对,仔细找了半天才发现是缓冲区我设置的大小是2049,改成2048就可以。呵呵。。。难道缓冲区一定要是1024的倍数?这个大家可以一起讨论一下。
2.关于软件开发的。其实android开发和所有的软件开发都是一样的,教程只是给没接触过这一块的人一些方向,而不是让大家都按这样来写,俗话说“尽信书不如无书”,如果大家下载了源码,跑起来一看,与预期的不一样,大家不要急着心里就骂“kris是个大骗子”,你可以静下心来好好看一下代码及他的处理的流程,试着自己去解决一下问题。这样自己对这个知识点的理解会更深刻得多。每个人的思维方式都是不一样的,只有自己理解了的东西,在下次应用的时候才会更加灵活的变通成与自己的程序结构一致的功能,成为自己的东西。