import android.content.Context;
import android.util.Log; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream; public class ZipUtils {
public static final String TAG="ZIP";
public ZipUtils(){
} /**
* 解压zip到指定的路径
* @param zipFileString ZIP的名称
* @param outPathString 要解压缩路径
* @throws Exception
*/
public static void UnZipFolder(String zipFileString, String outPathString , Context context) throws Exception {
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry; String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(, szName.length() - );
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
Log.e(TAG,outPathString + File.separator + szName);
File file = new File(outPathString + File.separator + szName);
if (!file.exists()){
Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, , len);
out.flush();
}
out.close();
}
}
inZip.close();
} public static void UnZipFolder(String zipFileString, String outPathString, String szName) throws Exception {
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
while ((zipEntry = inZip.getNextEntry()) != null) {
//szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(, szName.length() - );
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
Log.e(TAG,outPathString + File.separator + szName);
File file = new File(outPathString + File.separator + szName);
if (!file.exists()){
Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, , len);
out.flush();
}
out.close();
}
}
inZip.close();
} /**
* 压缩文件和文件夹
* @param srcFileString 要压缩的文件或文件夹
* @param zipFileString 解压完成的Zip路径
* @throws Exception
*/
public static void ZipFolder(String srcFileString, String zipFileString)throws Exception {
//创建ZIP
ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
//创建文件
File file = new File(srcFileString);
//压缩
ZipFiles(file.getParent()+ File.separator, file.getName(), outZip);
//完成和关闭
outZip.finish();
outZip.close();
} /**
* 压缩文件
* @param folderString
* @param fileString
* @param zipOutputSteam
* @throws Exception
*/
private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam)throws Exception {
if(zipOutputSteam == null)
return;
File file = new File(folderString+fileString);
if (file.isFile()) {
ZipEntry zipEntry = new ZipEntry(fileString);
FileInputStream inputStream = new FileInputStream(file);
zipOutputSteam.putNextEntry(zipEntry);
int len;
byte[] buffer = new byte[];
while((len=inputStream.read(buffer)) != -)
{
zipOutputSteam.write(buffer, , len);
}
zipOutputSteam.closeEntry();
}
else {
//文件夹
String fileList[] = file.list();
//没有子文件和压缩
if (fileList.length <= ) {
ZipEntry zipEntry = new ZipEntry(fileString+ File.separator);
zipOutputSteam.putNextEntry(zipEntry);
zipOutputSteam.closeEntry();
}
//子文件和递归
for (int i = ; i < fileList.length; i++) {
ZipFiles(folderString, fileString+ File.separator+fileList[i], zipOutputSteam);
}
}
} /**
* 返回zip的文件输入流
* @param zipFileString zip的名称
* @param fileString ZIP的文件名
* @return InputStream
* @throws Exception
*/
public static InputStream UpZip(String zipFileString, String fileString)throws Exception {
ZipFile zipFile = new ZipFile(zipFileString);
ZipEntry zipEntry = zipFile.getEntry(fileString);
return zipFile.getInputStream(zipEntry);
} /**
* 返回ZIP中的文件列表(文件和文件夹)
* @param zipFileString ZIP的名称
* @param bContainFolder 是否包含文件夹
* @param bContainFile 是否包含文件
* @return
* @throws Exception
*/
public static List<File> GetFileList(String zipFileString, boolean bContainFolder, boolean bContainFile)throws Exception {
List<File> fileList = new ArrayList<File>();
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
// 获取部件的文件夹名
szName = szName.substring(, szName.length() - );
File folder = new File(szName);
if (bContainFolder) {
fileList.add(folder);
}
} else {
File file = new File(szName);
if (bContainFile) {
fileList.add(file);
}
}
}
inZip.close();
return fileList;
}
}

使用:

                    // 需要解压的文件
String zipFileName = Environment.getExternalStorageDirectory().getPath() + "/xxxx/resource/"+fileName;
// 解压到的目录位置
String zipToFilePath = Environment.getExternalStorageDirectory().getPath() + "/xxxx/"+fileName;
// 解压指定文件到指定目录 ,成功后删除
try {
ZipUtils.UnZipFolder(zipFileName, zipToFilePath,getActivity());
hasDowmResourceNum++; // 已经下载完成的资源个数+1
} catch (Exception e) {
e.printStackTrace();
Log.i("xqxinfo","e:"+e.getMessage().toString());
hasDowmErrorResourceNum++; // 下载失败的资源个数+1
}

项目实战工具类(二):ZipUtils(压缩/解压缩文件相关)的更多相关文章

  1. (转载)项目实战工具类(一):PhoneUtil(手机信息相关)

    项目实战工具类(一):PhoneUtil(手机信息相关)   可以使用的功能: 1.获取手机系统版本号 2.获取手机型号 3.获取手机宽度 4.获取手机高度 5.获取手机imei串号 ,GSM手机的 ...

  2. 项目实战工具类(一):PhoneUtil(手机信息相关)

    可以使用的功能: 1.获取手机系统版本号 2.获取手机型号 3.获取手机宽度 4.获取手机高度 5.获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 6.获取手机sim卡 ...

  3. 一个使用命令行编译Android项目的工具类

    一个使用命令行编译Android项目的工具类 简单介绍 编译apk项目须要使用的几个工具,基本都在sdk中,它们各自是(Windows系统): 1.aapt.exe 资源打包工具 2.android. ...

  4. 使用VC++压缩解压缩文件夹

    前言   项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码,  都不是很称心, 现在把我自己实现的代码和大家分享. 要求: 1.使用Unicode(支持中文). 2.使用源代码.(不使用静态或 ...

  5. Linux的压缩/解压缩文件处理 zip & unzip

    Linux的压缩/解压缩命令详解及实例 压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip 另:有些服 ...

  6. java http工具类和HttpUrlConnection上传文件分析

    利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式.那么就可以用任何一门语言来模拟浏览器上传文件.下面有几篇文章从http协议入手介绍了java ...

  7. 写文件的工具类,输出有格式的文件(txt、json/csv)

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  8. Android开源项目大全 - 工具类

    主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...

  9. Android开源项目发现--- 工具类网络相关篇(持续更新)

    1. Asynchronous Http Client for Android Android异步Http请求 项目地址:https://github.com/loopj/android-async- ...

随机推荐

  1. FreeSql.DbContext 第二个版本介绍

    FreeSql.DbContext 实现类似 EFCore 使用方法,跟踪对象状态,最终通过 SaveChanges 方法提交事务. 目前是第二个初版,已实现状态跟踪保存(导航属性的跟踪暂时不支持). ...

  2. TreeSet集合解析

    TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简析 假如有这么一个集 ...

  3. NET 泛型,详细介绍

    今天的文章是因为再给一个朋友讲这个的时候随手记录下整理出来的.说白了就是把前辈们曾经给我吹过的我又吹了出去. 泛型:是C# FrameWork 2.0 时代 加入进来的,可以说对与Net开发人员来说泛 ...

  4. Java实现简易联网坦克对战小游戏

    目录 介绍 本项目的Github地址 基础版本 游戏的原理, 图形界面(非重点) 游戏逻辑 网络联机 客户端连接上服务器 定义应用层协议 TankNewMsg TankMoveMsg MissileN ...

  5. Git 学习总结

    概况 CVS 及 SVN 都是集中式的版本控制系统,而 Git 是分布式版本控制系统. 集中式版本控制系统最大的毛病就是必须联网才能工作: 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是 ...

  6. Windows Server 2016-启用默认Windows搜索服务

    当我们使用Windows Server 2016尝试从开始菜单或基于Windows Server 2016的计算机上的Cortana 搜索时,我们不会收到任何结果或不一致的结果. 原因 默认情况下, ...

  7. JVM监控命令

    1.概述Jcmd是一个诊断Jvm的命令集工具, 集成了包括Jps, Jstack以及采集JFR信息等功能. 它必须运行在被诊断Jvm进程的同一台机器上.1)查询JVM进程及PID/dapeng-con ...

  8. Python 闭包小记

    闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来 ...

  9. JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

    一.Array 1.some()和every() some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true. every()是对数组中的每一项运行给定函数,如果该函数对 ...

  10. IntentActionUtil【Intent的常见作用的工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 主要用于通过Intent调用手机本地软件打开文件(doc.xsl.pdf.ppt.mp3.mp4等格式).安装apk.发送邮件.拨打 ...