Android Zip解压缩工具类分享

本文实例为大家分享了Android Zip解压缩工具类的具体代码,供大家参考,具体内容如下

package com.example.zip.commons.utils;

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;

/**
 * @author: lijuan
 * @description: 解压ZIP文件
 * @date: 2017-04-11
 * @time: 09:22
 */
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) 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(0, szName.length() - 1);
    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[1024];
    // 读取(字节)字节到缓冲区
    while ((len = inZip.read(buffer)) != -1) {
     // 从缓冲区(0)位置写入(字节)字节
     out.write(buffer, 0, 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(0, szName.length() - 1);
    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[1024];
    // 读取(字节)字节到缓冲区
    while ((len = inZip.read(buffer)) != -1) {
     // 从缓冲区(0)位置写入(字节)字节
     out.write(buffer, 0, 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[4096];
   while((len=inputStream.read(buffer)) != -1)
   {
    zipOutputSteam.write(buffer, 0, len);
   }
   zipOutputSteam.closeEntry();
  }
  else {
   //文件夹
   String fileList[] = file.list();
   //没有子文件和压缩
   if (fileList.length <= 0) {
    ZipEntry zipEntry = new ZipEntry(fileString+File.separator);
    zipOutputSteam.putNextEntry(zipEntry);
    zipOutputSteam.closeEntry();
   }
   //子文件和递归
   for (int i = 0; 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(0, szName.length() - 1);
    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;
 }
}

添加权限

<!-- 允许应用程序写数据到外部存储设备(主要是SD卡) -->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <!-- 在sdcard中创建/删除文件的权限 -->
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

在具体的场景中测试一下

ZipUtils.UnZipFolder(AppConfig.DOWNLOAD_PATH + info.getFileName(), AppConfig.UNZIP_PATH);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android zip文件下载和解压实例

    下载:DownLoaderTask.java 复制代码 代码如下: package com.johnny.testzipanddownload; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IO

  • 仿墨迹天气在Android App中实现自定义zip皮肤更换

    在这里谈一下墨迹天气的换肤实现方式,不过首先声明我只是通过反编译以及参考了一些网上其他资料的方式推测出的换肤原理, 在这里只供参考. 若大家有更好的方式, 欢迎交流. 墨迹天气下载的皮肤就是一个zip格式的压缩包,在应用的时候把皮肤资源释放到墨迹天气应用的目录下,更换皮肤时新的皮肤资源会替换掉老的皮肤资源每次加载的时候就是从手机硬盘上读取图片,这些图片资源的命名和程序中的资源的命名保持一致,一旦找不到这些资源,可以选择到系统默认中查找.这种实现是直接读取了外部资源文件,在程序运行时通过代码显示的

  • Android Zipalign工具优化Android APK应用

    生成的Android应用APK文件最好进行优化,因为APK包的本质是一个zip压缩文档,经过优化能使包内未压缩的数据有序的排列,从而减少应用程序运行时的内存消耗.我们可以使用Zipalign工具进行APK优化. 据Android官方网站的说明,Zipalign是一款重要的优化APK应用程序的工具. 多数软件开发商在正式推出其Android应用程序,都使用Zipalign工具优化APK包.但是,仍然有一些应用程序需要我们自己动手进行Zipalign优化,例如一些个人开发的软件.一些破解版的软件.

  • Android实现下载zip压缩文件并解压的方法(附源码)

    前言 其实在网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,所以这篇文章在此记录一下下载zip文件并直接解压的方法,直接上代码,文末有源码下载. 下载: import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream

  • 在Android系统中使用gzip进行数据传递实例代码

    接下来,让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.作者在写这篇博客时经过测试,4.4MB的文本数据经过Gzip传输到客户端之后变为392KB,压缩效率极高. 一.服务端 服务端有2种方式去压缩,一种可以自己压缩,但是更推荐第二种方式,用PrintWrite

  • Android GZip的使用-开发中网络请求的压缩实例详解

    Android  GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.一般服务器中都安装有这个功能模块的,服务器端不需做改动. 当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据. 从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-En

  • Android实现zip文件压缩及解压缩的方法

    本文实例讲述了Android实现zip文件压缩及解压缩的方法.分享给大家供大家参考.具体如下: DirTraversal.java如下: package com.once; import java.io.File; import java.util.ArrayList; import java.util.LinkedList; /** * 文件夹遍历 * @author once * */ public class DirTraversal { //no recursion public sta

  • Android APK优化工具Zipalign详解

    Android SDK中包含了一个用于优化APK的新工具zipalign.它提高了优化后的Applications与Android系统的交互效率(俗话:"要致富先修路",Android小组重新为Applications与Android系统之间搭建了一条高速公路),从而可以使整个系统的运行速度有了较大的提升.Android小组强烈建议开发者在发布新Apps之前使用zipalign优化工具,而且对于已经发布但不受限于系统版本的Apps,建议用优化后的APK替换现有的版本. 在下面的内容中将

  • Android中实现下载和解压zip文件功能代码分享

    本文提供了2段Android代码,实现了从Android客户端下载ZIP文件并且实现ZIP文件的解压功能,非常实用,有需要的Android开发者可以尝试一下. 下载: DownLoaderTask.java 复制代码 代码如下: package com.johnny.testzipanddownload; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; im

  • Android Zip解压缩工具类分享

    本文实例为大家分享了Android Zip解压缩工具类的具体代码,供大家参考,具体内容如下 package com.example.zip.commons.utils; import android.util.Log; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList

  • Android AES加密工具类分享

    1.AES加密工具类 java不支持PKCS7Padding,只支持PKCS5Padding.我们知道加密算法由算法+模式+填充组成,下一篇介绍iOS和Android通用的AES加密,本篇文章使用PKCS5Padding加密方式. package com.example.aesdemo; import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.SecretK

  • Java实现的zip压缩及解压缩工具类示例

    本文实例讲述了Java实现的zip压缩及解压缩工具类.分享给大家供大家参考,具体如下: import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import ja

  • Java压缩解压缩工具类

    本文实例为大家分享了Java压缩解压缩工具类的具体代码,供大家参考,具体内容如下 package com.wdy.tools.utils.pressuitl; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import

  • Android相机管理工具类

    本文实例为大家分享了Android相机管理工具类的具体代码,供大家参考,具体内容如下 package com.utils.tools; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import com.shennongshi.dingdong.R; import com.shennongshi.dingdong.pztools.IntentConstant.R

  • Android手机管理工具类详解

    Android手机管理工具类 AppPhoneMgr分享给大家,供大家参考,具体内容如下 工具类内的方法: getInstance          : 单例对象 getSDKVersionNumber  : 获取手机系统版本号 getPhoneModel        : 获取手机型号 getPhoneWidth        : 获取手机宽度 getPhoneHeight       : 获取手机高度 getPhoneImei         : 获取手机imei串号 ,GSM手机的 IME

  • Android编程录音工具类RecorderUtil定义与用法示例

    本文实例讲述了Android编程录音工具类RecorderUtil定义与用法.分享给大家供大家参考,具体如下: 以下工具类都是经过实战开发验证都是可以直接复制使用的. 录音工具类介绍: 录音工具类主要平时用来开发语音聊天的,在微信和QQ上该工具类都是常用的,因为语音聊天. 使用硬件一般都要开权限,别忘了.这里还需要搭配 Android FileUtil 类使用,为了方便才这么封装的 import android.media.MediaRecorder; import android.util.L

  • Android屏幕适配工具类 Android自动生成不同分辨率的值

    本文实例为大家分享了Android屏幕适配工具类的具体代码,供大家参考,具体内容如下 DimenTool github地址 Android 屏幕适配方案,自动生成不同分辨率的值 android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件.然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的dp或者sp单位.开发中发现,android屏幕适配需要用到很多的尺寸,每个尺寸都建立dimens.xml问

  • Android读写文件工具类详解

    本文实例为大家分享了Android读写文件工具类的具体代码,供大家参考,具体内容如下 public class Utils { private static String path1 = Environment.getExternalStorageDirectory().getAbsolutePath(); private static String path2 = Environment.getDownloadCacheDirectory().getAbsolutePath(); privat

  • Android指纹登录工具类封装

    本文实例为大家分享了Android指纹登录工具类的封装代码,供大家参考,具体内容如下 核心 Android 指纹 是在 6.0 才出来的一个重要的功能 @RequiresApi(api = Build.VERSION_CODES.M) 核心的两个 api: FingerprintManager KeyguardManager step1 判断android 版本,如果小于 6.0 支持不了指纹 if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){

随机推荐