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) {
            }
           }
          }
         }
        }
  • 相关阅读:
    LeetCode Count of Range Sum
    LeetCode 158. Read N Characters Given Read4 II
    LeetCode 157. Read N Characters Given Read4
    LeetCode 317. Shortest Distance from All Buildings
    LeetCode Smallest Rectangle Enclosing Black Pixels
    LeetCode 315. Count of Smaller Numbers After Self
    LeetCode 332. Reconstruct Itinerary
    LeetCode 310. Minimum Height Trees
    LeetCode 163. Missing Ranges
    LeetCode Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/dream550/p/4026137.html
Copyright © 2011-2022 走看看