zoukankan      html  css  js  c++  java
  • java.util.zip

    include my own version for your reference.
    We use this one to zip up photos to download so it works with various unzip programs. It preserves the directory structure and timestamps.

    public static void createZipFile(File srcDir, OutputStream out,
       boolean verbose) throws IOException {
    
      List<String> fileList = listDirectory(srcDir);
      ZipOutputStream zout = new ZipOutputStream(out);
    
      zout.setLevel(9);
      zout.setComment("Zipper v1.2");
    
      for (String fileName : fileList) {
       File file = new File(srcDir.getParent(), fileName);
       if (verbose)
        System.out.println("  adding: " + fileName);
    
       // Zip always use / as separator
       String zipName = fileName;
       if (File.separatorChar != '/')
        zipName = fileName.replace(File.separatorChar, '/');
       ZipEntry ze;
       if (file.isFile()) {
        ze = new ZipEntry(zipName);
        ze.setTime(file.lastModified());
        zout.putNextEntry(ze);
        FileInputStream fin = new FileInputStream(file);
        byte[] buffer = new byte[4096];
        for (int n; (n = fin.read(buffer)) > 0;)
         zout.write(buffer, 0, n);
        fin.close();
       } else {
        ze = new ZipEntry(zipName + '/');
        ze.setTime(file.lastModified());
        zout.putNextEntry(ze);
       }
      }
      zout.close();
     }
    
     public static List<String> listDirectory(File directory)
       throws IOException {
    
      Stack<String> stack = new Stack<String>();
      List<String> list = new ArrayList<String>();
    
      // If it's a file, just return itself
      if (directory.isFile()) {
       if (directory.canRead())
        list.add(directory.getName());
       return list;
      }
    
      // Traverse the directory in width-first manner, no-recursively
      String root = directory.getParent();
      stack.push(directory.getName());
      while (!stack.empty()) {
       String current = (String) stack.pop();
       File curDir = new File(root, current);
       String[] fileList = curDir.list();
       if (fileList != null) {
        for (String entry : fileList) {
         File f = new File(curDir, entry);
         if (f.isFile()) {
          if (f.canRead()) {
           list.add(current + File.separator + entry);
          } else {
           System.err.println("File " + f.getPath()
             + " is unreadable");
           throw new IOException("Can't read file: "
             + f.getPath());
          }
         } else if (f.isDirectory()) {
          list.add(current + File.separator + entry);
          stack.push(current + File.separator + f.getName());
         } else {
          throw new IOException("Unknown entry: " + f.getPath());
         }
        }
       }
      }
      return list;
     }
    }

    SEPARATOR constant is initialised with the System.getProperty("file.separator") which will give me the OS default file separator.
    I would never hardcode a separator since that assumes that your code will only be deployed on a given OS

    Don't use File.separator in ZIP. The separator must be "/" according to the spec. If you are on Windows, you must open file as "D:dirsubdirfile" but ZIP entry must be "dir/subdir/file"

    Just go through the source of java.util.zip.ZipEntry. It treats a ZipEntry as directory if its name ends with "/" characters. Just suffix the directory name with "/". Also you need to remove the drive prefix to make it relative.

    Here is another example (recursive) which also lets you include/exclude the containing folder form the zip:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class ZipUtil {
    
      private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
    
      public static void main(String[] args) throws Exception {
        zipFile("C:/tmp/demo", "C:/tmp/demo.zip", true);
      }
    
      public static void zipFile(String fileToZip, String zipFile, boolean excludeContainingFolder)
        throws IOException {        
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));    
    
        File srcFile = new File(fileToZip);
        if(excludeContainingFolder && srcFile.isDirectory()) {
          for(String fileName : srcFile.list()) {
            addToZip("", fileToZip + "/" + fileName, zipOut);
          }
        } else {
          addToZip("", fileToZip, zipOut);
        }
    
        zipOut.flush();
        zipOut.close();
    
        System.out.println("Successfully created " + zipFile);
      }
    
      private static void addToZip(String path, String srcFile, ZipOutputStream zipOut)
        throws IOException {        
        File file = new File(srcFile);
        String filePath = "".equals(path) ? file.getName() : path + "/" + file.getName();
        if (file.isDirectory()) {
          for (String fileName : file.list()) {             
            addToZip(filePath, srcFile + "/" + fileName, zipOut);
          }
        } else {
          zipOut.putNextEntry(new ZipEntry(filePath));
          FileInputStream in = new FileInputStream(srcFile);
    
          byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
          int len;
          while ((len = in.read(buffer)) != -1) {
            zipOut.write(buffer, 0, len);
          }
    
          in.close();
        }
      }
    }

    http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structure

  • 相关阅读:
    大学毕业4年-回顾和总结(10)-资金账务系统的架构设计(产品视角+技术视角)(图文并茂)
    大学毕业4年-回顾和总结(10)-资金账务系统的架构设计(产品视角+技术视角)(图文并茂)
    Spring核心技术(六)——Spring中Bean的生命周期
    商业研究(20):滴滴出行,进军海外包车?与OTA携程和包车创业公司,共演“三国杀”?看看分析师、投资人和权威人士等10个人的观点碰撞
    商业研究(20):滴滴出行,进军海外包车?与OTA携程和包车创业公司,共演“三国杀”?看看分析师、投资人和权威人士等10个人的观点碰撞
    玩转Android之二维码生成与识别
    大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)
    大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)
    【Raspberry pi】系统安装及基础配置
    【python】字符串编码问题
  • 原文地址:https://www.cnblogs.com/softidea/p/4273093.html
Copyright © 2011-2022 走看看