android zip压缩

  最近需要对输出的文件进行压缩,了解了下android的压缩功能,源码如下:

activity调用:

try {
            ZipUtil2.zip(exportPath, exportPath+".zip");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

压缩类原型:

package com.tecsun.idc.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;


public class ZipUtil2 {
     
     public static void zip(String src, String dest) throws IOException {
      //提供了一个数据项压缩成一个ZIP归档输出流
      ZipOutputStream out = null;
      try {
       
       File outFile = new File(dest);//源文件或者目录
       File fileOrDirectory = new File(src);//压缩文件路径
       out = new ZipOutputStream(new FileOutputStream(outFile));
       //如果此文件是一个文件,否则为false。
       if (fileOrDirectory.isFile()) {
        zipFileOrDirectory(out, fileOrDirectory, "");
       } else {
        //返回一个文件或空阵列。
        File[] entries = fileOrDirectory.listFiles();
        for (int i = 0; i < entries.length; i++) {
         // 递归压缩,更新curPaths
         zipFileOrDirectory(out, entries[i], "");
        }
       }
      } catch (IOException ex) {
       ex.printStackTrace();
      } finally {
       //关闭输出流
       if (out != null) {
        try {
         out.close();
        } catch (IOException ex) {
         ex.printStackTrace();
        }
       }
      }
     }

     
     private static void zipFileOrDirectory(ZipOutputStream out,
       File fileOrDirectory, String curPath) throws IOException {
      //从文件中读取字节的输入流
      FileInputStream in = null;
      try {
       //如果此文件是一个目录,否则返回false。
       if (!fileOrDirectory.isDirectory()) {
        // 压缩文件
        byte[] buffer = new byte[4096];
        int bytes_read;
        in = new FileInputStream(fileOrDirectory);
        //实例代表一个条目内的ZIP归档
        ZipEntry entry = new ZipEntry(curPath
          + fileOrDirectory.getName());
        //条目的信息写入底层流
        out.putNextEntry(entry);
        while ((bytes_read = in.read(buffer)) != -1) {
         out.write(buffer, 0, bytes_read);
        }
        out.closeEntry();
       } else {
        // 压缩目录
        File[] entries = fileOrDirectory.listFiles();
        for (int i = 0; i < entries.length; i++) {
         // 递归压缩,更新curPaths
         zipFileOrDirectory(out, entries[i], curPath
           + fileOrDirectory.getName() + "/");
        }
       }
      } catch (IOException ex) {
       ex.printStackTrace();
       // throw ex;
      } finally {
       if (in != null) {
        try {
         in.close();
        } catch (IOException ex) {
         ex.printStackTrace();
        }
       }
      }
     }

     
     @SuppressWarnings("unchecked")
     public static void unzip(String zipFileName, String outputDirectory)
       throws IOException {
      ZipFile zipFile = null;
      try {
       zipFile = new ZipFile(zipFileName);
       Enumeration e = zipFile.entries();
       ZipEntry zipEntry = null;
       File dest = new File(outputDirectory);
       dest.mkdirs();
       while (e.hasMoreElements()) {
        zipEntry = (ZipEntry) e.nextElement();
        String entryName = zipEntry.getName();
        InputStream in = null;
        FileOutputStream out = null;
        try {
         if (zipEntry.isDirectory()) {
          String name = zipEntry.getName();
          name = name.substring(0, name.length() - 1);

          File f = new File(outputDirectory + File.separator
            + name);
          f.mkdirs();
         } else {
          int index = entryName.lastIndexOf("\\");
          if (index != -1) {
           File df = new File(outputDirectory + File.separator
             + entryName.substring(0, index));
           df.mkdirs();
          }
          index = entryName.lastIndexOf("/");
          if (index != -1) {
           File df = new File(outputDirectory + File.separator
             + entryName.substring(0, index));
           df.mkdirs();
          }
          File f = new File(outputDirectory + File.separator
            + zipEntry.getName());
          // f.createNewFile();
          in = zipFile.getInputStream(zipEntry);
          out = new FileOutputStream(f);

          int c;
          byte[] by = new byte[1024];

          while ((c = in.read(by)) != -1) {
           out.write(by, 0, c);
          }
          out.flush();
         }
        } catch (IOException ex) {
         ex.printStackTrace();
         throw new IOException("解压失败:" + ex.toString());
        } finally {
         if (in != null) {
          try {
           in.close();
          } catch (IOException ex) {
          }
         }
         if (out != null) {
          try {
           out.close();
          } catch (IOException ex) {
          }
         }
        }
       }
      } catch (IOException ex) {
       ex.printStackTrace();
       throw new IOException("解压失败:" + ex.toString());
      } finally {
       if (zipFile != null) {
        try {
         zipFile.close();
        } catch (IOException ex) {
        }
       }
      }
     }
    }

 

posted on 2014-10-15 13:31  小太阳550  阅读(334)  评论(0编辑  收藏  举报

导航