zoukankan      html  css  js  c++  java
  • zip 的 压缩与解压

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/xiananliu/article/details/23993481

    zip格式是开源的相比rar格式,zip的压缩和解压都是非常方便的,我们须要用到apache ant 项目里的 ant.jar

    点击下载 :http://download.csdn.net/detail/xiananliu/7211325

    先附上 解压的 方法


     /**
      * 解压zip包的内容到指定的目录下。能够处理其目录下包括子目录的情况
      * 
      * @param zipFilename
      *            要解压的zip 
      * @param outputDirectory
      *            解压后存放的目录
      */
              public synchronized void unzip(String zipFilename, String outputDirectory)
    	   throws IOException {
    	  File outFile = new File(outputDirectory);
    	  if (!outFile.exists()) {
    	   outFile.mkdirs();
    	  }
    	  ZipFile zipFile = new ZipFile(zipFilename);
    	  Enumeration en = zipFile.getEntries();
    	  ZipEntry zipEntry = null;
    	  while (en.hasMoreElements()) {
    	   zipEntry = (ZipEntry) en.nextElement();
    	   if (zipEntry.isDirectory()) {
    	    // mkdir directory
    	    String dirName = zipEntry.getName();
    	    // System.out.println("=dirName is:=" + dirName + "=end=");
    	    dirName = dirName.substring(0, dirName.length() - 1);
    	    File f = new File(outFile.getPath() + File.separator + dirName);
    	    f.mkdirs();
    	   } else {
    	    // unzip file
    	    String strFilePath = outFile.getPath() + File.separator
    	      + zipEntry.getName();
    	    File f = new File(strFilePath);
    
    	    // the codes remedified by can_do on 2010-07-02 =begin=
    	    // /////begin/////
    	    // 推断文件不存在的话,就创建该文件所在目录的目录
    	    if (!f.exists()) {
    	     String[] arrFolderName = zipEntry.getName().split("/");
    	     String strRealFolder = "";
    	     for (int i = 0; i < (arrFolderName.length - 1); i++) {
    	      strRealFolder += arrFolderName[i] + File.separator;
    	     }
    	     strRealFolder = outFile.getPath() + File.separator
    	       + strRealFolder;
    	     File tempDir = new File(strRealFolder);
    	     // 此处使用.mkdirs()方法,而不能用.mkdir()
    	     tempDir.mkdirs();
    	    }
    	    // /////end///
    	    // the codes remedified by can_do on 2010-07-02 =end=
    	    f.createNewFile();
    	    InputStream in = zipFile.getInputStream(zipEntry);
    	    FileOutputStream out = new FileOutputStream(f);
    	    try {
    	     int c;
    	     byte[] by = new byte[BUFFEREDSIZE];
    	     while ((c = in.read(by)) != -1) {
    	      out.write(by, 0, c);
    	     }
    	     // out.flush();
    	    } catch (IOException e) {
    	     throw e;
    	    } finally {
    	    	if(in!=null){
    	    		
    	  		  in.close();
    	    	}
    	    	if(out!=null){
    	    	     out.close();
    	    	}}	   	 
    	   }
    	  }
    	  
    		zipFile.close();
    	 }

    这段代码是我到网上找的,我的项目中用到了解压,并且在解压后出现了源文件无法删除的问题。

    。。

    最后一句zipFile.close() 攻克了这个问题,除了关闭输入输出流。

    还要关闭这个  zipFile 对象。

    详细怎么回事我也不是非常清楚

    这个 zipFile 是 org.apache.tools.zip.ZipFile类型的

    我找到了 java.util.zip.ZipFile 的close()方法说明:

    关闭此 ZIP 文件将关闭曾经调用 getInputStream 方法返回的全部输入流。

    我想大概是一样的吧。

    本人愚钝请指教。

    。。。。

    以下是压缩的方法:

    	 /**
    	  * 压缩文件或者文件目录到指定的zip
    	  * 
    	  * @param inputFilename
    	  *            要压缩的文件或者目录。假设是目录的话,会将目录下的全部文件包括子目录的内容进行压缩
    	  * @param zipFilename
    	  *            生成的zip或者rar文件的名称
    	  */
    	 public synchronized void zip(String inputFilename, String zipFilename)
    	   throws IOException {
    	  zip(new File(inputFilename), zipFilename);
    	 }
    
    	 /**
    	  * 压缩文件或者文件目录到指定的zip,内部调用
    	  * 
    	  * @param inputFile
    	  *            參数为文件类型的要压缩的文件或者目录
    	  * @param zipFilename
    	  *            生成的zip文件的名称
    	  * @return void
    	  */
    	 private synchronized void zip(File inputFile, String zipFilename)
    	   throws IOException {
    	  ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
    	    zipFilename));
    
    	  try {
    	   zip(inputFile, out, "");
    	  } catch (IOException e) {
    	   throw e;
    	  } finally {
    	   out.close();
    	  }
    	 }
    
    	 /**
    	  * 压缩文件或者文件目录到指定的zip
    	  * 
    	  * @param inputFile
    	  *            參数为文件类型的要压缩的文件或者目录
    	  * @param out
    	  *            输出流
    	  * @param base
    	  *            基目录
    	  * @return void
    	  */
    	 private synchronized void zip(File inputFile, ZipOutputStream out,
    	   String base) throws IOException {
    	  if (inputFile.isDirectory()) {
    	   File[] inputFiles = inputFile.listFiles();
    	   out.putNextEntry(new ZipEntry(base + "/"));
    	   base = base.length() == 0 ? "" : base + "/";
    	   for (int i = 0; i < inputFiles.length; i++) {
    	    zip(inputFiles[i], out, base + inputFiles[i].getName());
    	   }
    
    	  } else {
    	   if (base.length() > 0) {
    	    out.putNextEntry(new ZipEntry(base));
    	   } else {
    	    out.putNextEntry(new ZipEntry(inputFile.getName()));
    	   }
    
    	   FileInputStream in = new FileInputStream(inputFile);
    	   try {
    	    int c;
    	    byte[] by = new byte[BUFFEREDSIZE];
    	    while ((c = in.read(by)) != -1) {
    	     out.write(by, 0, c);
    	    }
    	   } catch (IOException e) {
    	    throw e;
    	   } finally {
    	    in.close();
    	   }
    	  }
    	 }


    zip的压缩解压就是这样了。谢谢您的围观


  • 相关阅读:
    网络技术:网络互联模型
    二柱子代码版(应该不会在动它了)
    验证码-java界面版
    动手动脑1002
    动手动脑1001
    动手动脑0930
    动手动脑0929
    Java Web学习-0823
    Java Web学习-0822
    Java Web学习-0821
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10740937.html
Copyright © 2011-2022 走看看