Android Zip工具类ZipUtils

import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**

  • Java utils 实现的Zip工具

  • @author xx
    */
    public class ZipUtils {
    private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte

    /**

    • 批量压缩文件(夹)
    • @param resFileList 要压缩的文件(夹)列表
    • @param zipFile 生成的压缩文件
    • @throws IOException 当压缩过程出错时抛出
      */
      public static void zipFiles(Collection<File> resFileList, File zipFile) throws IOException {
      ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(
      zipFile), BUFF_SIZE));
      for (File resFile : resFileList) {
      zipFile(resFile, zipout, "");
      }
      zipout.close();
      }

    /**

    • 批量压缩文件(夹)
    • @param resFileList 要压缩的文件(夹)列表
    • @param zipFile 生成的压缩文件
    • @param comment 压缩文件的注释
    • @throws IOException 当压缩过程出错时抛出
      */
      public static void zipFiles(Collection<File> resFileList, File zipFile, String comment)
      throws IOException {
      ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(
      zipFile), BUFF_SIZE));
      for (File resFile : resFileList) {
      zipFile(resFile, zipout, "");
      }
      zipout.setComment(comment);
      zipout.close();
      }

    /**

    • 解压缩一个文件 160314

    • @param zipFile 压缩文件

    • @param folderPath 解压缩的目标目录

    • @throws IOException 当解压缩过程出错时抛出
      */
      public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException {
      File desDir = new File(folderPath);
      if (!desDir.exists()) {
      desDir.mkdirs();
      }
      ZipFile zf = new ZipFile(zipFile);
      for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) {
      ZipEntry entry = ((ZipEntry)entries.nextElement());
      //ss:if it's a filedir,it need to be opened 160314
      //String name = entry.getName();
      //if(name.endsWith(File.separator))
      //continue;

       InputStream in = zf.getInputStream(entry);
       String str = folderPath + File.separator + entry.getName();
       str = new String(str.getBytes("8859_1"), "GB2312");
       File desFile = new File(str);
       if (!desFile.exists()) {
           File fileParentDir = desFile.getParentFile();
           if (!fileParentDir.exists()) {
               fileParentDir.mkdirs();
           }
           desFile.createNewFile();
       }
       OutputStream out = new FileOutputStream(desFile);
       byte buffer[] = new byte[BUFF_SIZE];
       int realLength;
       while ((realLength = in.read(buffer)) > 0) {
           out.write(buffer, 0, realLength);
       }
       in.close();
       out.close();
      

      }
      }

    /**

    • 解压文件名包含传入文字的文件

    • @param zipFile 压缩文件

    • @param folderPath 目标文件夹

    • @param nameContains 传入的文件匹配名

    • @throws ZipException 压缩格式有误时抛出

    • @throws IOException IO错误时抛出
      */
      public static ArrayList<File> upZipSelectedFile(File zipFile, String folderPath,
      String nameContains) throws ZipException, IOException {
      ArrayList<File> fileList = new ArrayList<File>();

      File desDir = new File(folderPath);
      if (!desDir.exists()) {
      desDir.mkdir();
      }

      ZipFile zf = new ZipFile(zipFile);
      for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) {
      ZipEntry entry = ((ZipEntry)entries.nextElement());
      if (entry.getName().contains(nameContains)) {
      InputStream in = zf.getInputStream(entry);
      String str = folderPath + File.separator + entry.getName();
      str = new String(str.getBytes("8859_1"), "GB2312");
      // str.getBytes("GB2312"),"8859_1" 输出
      // str.getBytes("8859_1"),"GB2312" 输入
      File desFile = new File(str);
      if (!desFile.exists()) {
      File fileParentDir = desFile.getParentFile();
      if (!fileParentDir.exists()) {
      fileParentDir.mkdirs();
      }
      desFile.createNewFile();
      }
      OutputStream out = new FileOutputStream(desFile);
      byte buffer[] = new byte[BUFF_SIZE];
      int realLength;
      while ((realLength = in.read(buffer)) > 0) {
      out.write(buffer, 0, realLength);
      }
      in.close();
      out.close();
      fileList.add(desFile);
      }
      }
      return fileList;
      }

    /**

    • 获得压缩文件内文件列表
    • @param zipFile 压缩文件
    • @return 压缩文件内文件名称
    • @throws ZipException 压缩文件格式有误时抛出
    • @throws IOException 当解压缩过程出错时抛出
      */
      public static ArrayList<String> getEntriesNames(File zipFile) throws ZipException, IOException {
      ArrayList<String> entryNames = new ArrayList<String>();
      Enumeration<?> entries = getEntriesEnumeration(zipFile);
      while (entries.hasMoreElements()) {
      ZipEntry entry = ((ZipEntry)entries.nextElement());
      entryNames.add(new String(getEntryName(entry).getBytes("GB2312"), "8859_1"));
      }
      return entryNames;
      }

    /**

    • 获得压缩文件内压缩文件对象以取得其属性
    • @param zipFile 压缩文件
    • @return 返回一个压缩文件列表
    • @throws ZipException 压缩文件格式有误时抛出
    • @throws IOException IO操作有误时抛出
      */
      public static Enumeration<?> getEntriesEnumeration(File zipFile) throws ZipException,
      IOException {
      ZipFile zf = new ZipFile(zipFile);
      return zf.entries();

    }

    /**

    • 取得压缩文件对象的注释
    • @param entry 压缩文件对象
    • @return 压缩文件对象的注释
    • @throws UnsupportedEncodingException
      */
      public static String getEntryComment(ZipEntry entry) throws UnsupportedEncodingException {
      return new String(entry.getComment().getBytes("GB2312"), "8859_1");
      }

    /**

    • 取得压缩文件对象的名称
    • @param entry 压缩文件对象
    • @return 压缩文件对象的名称
    • @throws UnsupportedEncodingException
      */
      public static String getEntryName(ZipEntry entry) throws UnsupportedEncodingException {
      return new String(entry.getName().getBytes("GB2312"), "8859_1");
      }

    /**

    • 压缩文件
    • @param resFile 需要压缩的文件(夹)
    • @param zipout 压缩的目的文件
    • @param rootpath 压缩的文件路径
    • @throws FileNotFoundException 找不到文件时抛出
    • @throws IOException 当压缩过程出错时抛出
      */
      private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath)
      throws FileNotFoundException, IOException {
      rootpath = rootpath + (rootpath.trim().length() == 0 ? "" : File.separator)
      + resFile.getName();
      rootpath = new String(rootpath.getBytes("8859_1"), "GB2312");
      if (resFile.isDirectory()) {
      File[] fileList = resFile.listFiles();
      for (File file : fileList) {
      zipFile(file, zipout, rootpath);
      }
      } else {
      byte buffer[] = new byte[BUFF_SIZE];
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(resFile),
      BUFF_SIZE);
      zipout.putNextEntry(new ZipEntry(rootpath));
      int realLength;
      while ((realLength = in.read(buffer)) != -1) {
      zipout.write(buffer, 0, realLength);
      }
      in.close();
      zipout.flush();
      zipout.closeEntry();
      }
      }
      }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 10,018评论 2 95
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • DiskLurCache 使用教程 源码解析 使用 打开缓存 打开缓存函数public static DiskLr...
    super小立立阅读 907评论 1 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • 转自http://www.open-open.com/lib/view/open1363592512046.htm...
    Feng_Sir阅读 2,458评论 0 4