zoukankan      html  css  js  c++  java
  • 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) {
            }
           }
          }
         }
        }
  • 相关阅读:
    堆、栈、值类型、引用类型分析总结 Part 2
    DataGridView打印
    学习使用ArrayList
    C#与Java之比较
    【原创】串口通信测试程序
    彩色校验码的制作
    C#中使用进度条
    【原创】 Ajax之ModalPopup编程实例
    常用正则表达式
    堆、栈、值类型、引用类型分析总结 Part 1
  • 原文地址:https://www.cnblogs.com/dream550/p/4026137.html
Copyright © 2011-2022 走看看