Android下文件的压缩和解压(Zip格式)

Zip文件结构

ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。

文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的偏移,文件最后由End of central directory结束。

用到的类

ZipFile

此类用于从 ZIP 文件读取条目ZipEntry,在解压时用到

ZipEntry

此类用于表示 ZIP 文件条目

ZipOutputStream

此类为以 ZIP 文件格式写入文件实现输出流过滤器

Enumeration

实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素,在解压缩时会用到

CheckedOutputStream

需要维护写入数据校验和的输出流。校验和可用于验证输出数据的完整性。

CRC32

可用于计算数据流的 CRC-32 的类

压缩流程

首先要封装出一个ZipOutputStream: 

ZipOutputStream zipOutputStream = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(file),new CRC32()));

 

有了ZipOutputStream后,要压缩一个文件,就先在输出流加入一个ZipEntry,然后获取需要压缩的文件输入流,然后再输出:

注意最后要刷新和关闭输出流

zipOutputStream.flush();
zipOutputStream.close();

当然这只是单个文件的压缩,我们压缩文件时经常会压缩整个文件夹,所以还需要遍历整个文档,针对目录和文件分别作出判断:

if (fileSrc.isDirectory()) {File[] files = fileSrc.listFiles();name = name+"/"; zipOutputStream.putNextEntry(new ZipEntry(name)); // 建一个文件夹 System.out.println("目录名: "+name); for (File f : files) { zip(zipOutputStream,name+f.getName(),f); System.out.println("目录: "+name+f.getName()); } }

 

解压缩流程

解压缩就是压缩的逆过程,其过程就是从压缩文件中获取ZipEntry,获取其输入流,将其输出到指定位置:

这也是单个文件的解压缩,解压缩文件夹只需遍历ZipFile,判断ZipEntry是目录还是文件,具体操作不再详解,可到文末的源码中查看。

END

本文参考: 
Android 解压zip文件你知道多少?

源码: 
https://github.com/xiaoniu/AndroidZipFile

转载于:https://www.cnblogs.com/fuyaozhishang/p/9282101.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速理解和使用 ES7 await/async

await/async 是 ES7 最重要特性之一,它是目前为止 JS 最佳的异步解决方案了。虽然没有在 ES2016 中录入,但很快就到来,目前已经在 ES-Next Stage 4 阶段。 直接上例子,比如我们需要按顺序获取:产品数据>用户数据>…

jdeveloper优化:

D:\jdevstudio10133\jdev\bin\jdev.conf末尾加上下面的AddVMOption -Dsun.java2d.noddrawtrueAddVMOption -Dsun.java2d.ddoffscreenfalse 转载于:https://www.cnblogs.com/sprinng/p/4780112.html

linux make java版本,告诉make是否在Windows或Linux上运行

更新请阅读这个类似但更好的答案:https://stackoverflow.com/a/14777895/938111make (和 gcc )可以使用Cygwin或MinGW在MS-Windows上轻松安装 .正如ldigas所说, make 可以使用 UNAME:$(shell uname) 检测平台(命令 uname 也由Cygwin或MinGW安…

MPI多机器实现并行计算

最近使用一个系统的分布式版本搭建测试环境,该系统是基于MPI实现的并行计算,MPI是传统基于msg的系统,这个框架非常灵活,对程序的结构没有太多约束,高效实用简单,下面是MPI在多台机器上实现并行计算的过程。…

Jenkins_获取源码编译并启动服务(二)

一、创建Maven项目二、设置SVN信息三、设置构建触发器四、设置Maven命令五、设置构建后发邮件信息(参考文章一)六、设置构建后拷贝文件到远程机器并执行命令来自为知笔记(Wiz)

php 判断页面加载完,所有ajax执行完且页面加载完判断

jquery ajax&load 方法导致 js效果不显示或显示后由于加载后ajax 重新布局页面导致效果错误。解决思路:需要在ajax get post 或 load 等执行完后再去执行方法就不会由于他们没执行完导致的最终错误。那么首先看load 方法定义:jQuery ajax - load() 方…

正确理解ThreadLocal

想必很多朋友对 ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理 解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场…

2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数

昨天的注册收尾工作 其实就差了和MySql联系起来的部分,这部分很简单,首先要做的就是保存用户通过from传送过来的头像文件: """ 保存头像文件 """ file request.FILES.get(avatar) file_path os.path.join(st…

python 列表与元组的操作简介

上一篇:Python 序列通用操作介绍 列表 列表是可变的(mutable)——可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不可变的。接下来讨论一下列表所提供的方法。 list函数 可以使用list函数来创建列表: list(Hello) [H,…

mfc嵌入matlab绘图窗口,将matlab的图嵌入MFC

【实例简介】VS调用matlab画图模块编译成的动态链接库,并在MFC显示。【实例截图】【核心代码】3b0582a3-4ea8-4a61-ba33-e448be563b88└── 将matlab的图嵌入MFC├── matlab_2010b与VS2008_混合编程的实现.pdf├── TestWithData│ ├── Debug│ │ ├─…

python multiprocessing 和tcp

#用类方法 服务端from socket import *from multiprocessing import Processimport osclass Myprocess(Process): def __init__(self, conn): self.conn conn super().__init__() def run(self): conn self.conn start True whil…

matlab 画三维花瓶,精美花瓶建模教程

1、首先,草图单位为mm,进入前视图绘制如图草图,花瓶的基本形状轮廓2、然后对草图进行旋转3、旋转出曲面后,在顶部边线新建一个基准面4、继续在前视图绘制草图,如图绘制一弧线5、然后进行旋转6、可以得到图示的两个曲面…

PKI系统相关知识点介绍

公钥基础设施(Public Key Infrastructure,简称PKI)是目前网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为目前信息安全领域的热点。本文对PKI技术进行了全面的分析…

android 打印java堆栈,Android打印堆栈

java打印堆栈方法一:异常对象打印堆栈Exception e new Exception("this is a log");e.printStackTrace();方法二:Log打印获取异常的堆栈并打印Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));C\C打印堆栈方法一:…

实际算法项目工程上手日志C/C++

#pragma once 为了保证头文件只被编译一次,通常放在头文件的顶部 #define IN #define OUT #define INOUT 这个只在逻辑上起作用, IN 表示输入参数,指针指向的值不会修改; OUT 表示输出参数,指针指向的值会修改&a…

Arduino 控制超声波测距模块

一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单 转载于:https://www.cnblogs.com/caoguo/p/4785700.html

Linux安装source-code-pro字体

2019独角兽企业重金招聘Python工程师标准>>> 1.下载source-code-pro字体 从GitHub下载 https://github.com/adobe-fonts/source-code-pro/releases 2.解压文件,将OTF格式的文件夹重新命名一下,这里我命名为source-code-pro,然后将…

dft对称性 matlab实验,数字信号处理实验指导书(审)

(0???2?)上对X(ej?)均匀采样得到?X(k)?X(ej?)??2?k/N??n???x(n)e?j2?kn/N 0?k?N?1可以看到X(k)也是频域上的有限长序列,长度为N。序列X(k)称为序列x(n)的N点DFT。N称为DFT变换区间长度。 通常表示WN?e?j2?/N可将定义式表示为?X(k)??x(n)…

PI

并不是所有东西都可以套PI的,只有满足上述这类的数学关系才可以。 转速经过PI调节得到电流也是有原因的。从下图中可以发现,转速 k*Iq/s,s是拉普拉斯算子,所以也是满足积分,比例关系的。 转载于:https://www.cnblogs.…

AOP之AspectJ简单使用

为什么80%的码农都做不了架构师?>>> 参考文章: 使用AspectJ在Android中实现Aop 深入理解Android之AOP自动打印日志主要知识点: 主要是JPoint、pointcuts、advice以及他们之间的关系可以通过aj文件、或AspectJ注解的Java文件实现A…