java zip解压缩

Java 中如何进行zip包的解压缩呢?

有两种方式:

(1)使用jdk 自带的zip工具

(2)使用apache旗下的commons-compress

我下面要讲解的zip解压缩助手使用的是apache旗下的commons-compress.

工具运行界面如下:

 核心代码:

解压:

Java代码  

  1. /*** 
  2.      * 解压zip 
  3.      *  
  4.      * @param zipFile 
  5.      * @param decompressLoc 
  6.      *            :解压之后的文件所在目录 
  7.      * @throws ArchiveException 
  8.      * @throws IOException 
  9.      */  
  10.     public static boolean deCompressRecursion(String zipFile,  
  11.             File decompressLoc, String charSet) throws ArchiveException,  
  12.             IOException {  
  13.         FileInputStream fin = new FileInputStream(zipFile);  
  14.         ArchiveInputStream archIns = new ArchiveStreamFactory()  
  15.                 .createArchiveInputStream(ArchiveStreamFactory.ZIP, fin);  
  16.         ZipArchiveInputStream zipIn = (ZipArchiveInputStream) archIns;  
  17.         boolean isSuccess = deCompressRecursion(zipIn, decompressLoc, charSet);  
  18.         zipIn.close();  
  19.         return isSuccess;  
  20.     }  
  21. /*** 
  22.      * 递归解压缩. 
  23.      *  
  24.      * @param zipIn 
  25.      * @param decompressLoc 
  26.      * @return 
  27.      * @throws IOException 
  28.      */  
  29.     private static boolean deCompressRecursion(ZipArchiveInputStream zipIn,  
  30.             File decompressLoc, String charset) throws IOException {  
  31.         ZipArchiveEntry zipEntry;  
  32.         if (ValueWidget.isNullOrEmpty(charset)) {  
  33.             charset = SystemHWUtil.CHARSET_UTF;  
  34.         }  
  35.         while (!ValueWidget.isNullOrEmpty(zipEntry = zipIn.getNextZipEntry())) {  
  36.             byte[] rawName = zipEntry.getRawName();  
  37.             String fileName = new String(rawName, charset);  
  38.             // System.out.println(fileName);  
  39.             if (zipEntry.isDirectory()) {// 是目录  
  40.                 File newFolder = new File(decompressLoc, fileName);// 若子目录不存在,则创建之  
  41.                 System.out.println(newFolder.getAbsolutePath());  
  42.                 if (!newFolder.exists()) {  
  43.                     newFolder.mkdir();  
  44.                 }  
  45.                 // deCompressRecursion(zipIn, decompressLoc,charset);  
  46.             } else {// 是普通文件  
  47.                 File singFile = new File(decompressLoc, fileName);  
  48.                 System.out.println(singFile.getAbsolutePath());  
  49.                 if (singFile.exists()) {// 若解压后的文件已经存在,则直接退出  
  50.                     GUIUtil23.warningDialog("File \""  
  51.                             + singFile.getAbsolutePath() + "\" does  exist.");  
  52.                     return false;  
  53.                 }  
  54.                 /** 
  55.                  * 以下四行代码是后来添加的,为了解决父目录不存在的问题 
  56.                  */  
  57.                 File fatherFolder = singFile.getParentFile();  
  58.                 if (!fatherFolder.exists()) {  
  59.                     fatherFolder.mkdirs();  
  60.                 }  
  61.                 FileUtils.writeIn2Output(zipIn, new FileOutputStream(singFile),  
  62.                         true, false);  
  63.             }  
  64.         }  
  65.         return true;  
  66.     }  

 

压缩:

Java代码  

  1. /*** 
  2.      * 压缩文件. 
  3.      *  
  4.      * @param zipFile 
  5.      * @param folderPaths 
  6.      * @return 
  7.      * @throws ArchiveException 
  8.      * @throws IOException 
  9.      */  
  10.     public static boolean compressZipRecursion(String zipFile,  
  11.             String folderPaths) throws ArchiveException, IOException {  
  12.         FileOutputStream fou = new FileOutputStream(zipFile);  
  13.         ArchiveOutputStream archOuts = new ArchiveStreamFactory()  
  14.                 .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);  
  15.         if (archOuts instanceof ZipArchiveOutputStream) {  
  16.             ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;  
  17.             List<ZipArchiveEntry> zipEntrys = getZipFileListRecursion(new File(  
  18.                     folderPaths), null);  
  19.             for (int i = 0; i < zipEntrys.size(); i++) {  
  20.                 ZipArchiveEntry zipEntry2 = zipEntrys.get(i);  
  21.                 zipOut.putArchiveEntry(zipEntry2);  
  22.                 File file = new File(folderPaths, zipEntry2.getName());  
  23.                 if (!file.exists()) {  
  24.                     return false;  
  25.                 }  
  26.                 if (!file.isDirectory()) {  
  27.                     FileInputStream fin = new FileInputStream(file);  
  28.                     // 不要关闭zipOut,关闭之前要执行closeArchiveEntry()  
  29.                     FileUtils.writeIn2Output(fin, zipOut, false, true);  
  30.                 }  
  31.             }  
  32.             closeZip(zipOut, true);  
  33.   
  34.         }  
  35.         return true;  
  36.     }  
  37. /*** 
  38.      * 压缩之后的收尾操作. 
  39.      *  
  40.      * @param zipOut 
  41.      * @throws IOException 
  42.      */  
  43.     private static void closeZip(ZipArchiveOutputStream zipOut,  
  44.             boolean iscloseArchiveEntry) throws IOException {  
  45.         if (iscloseArchiveEntry) {  
  46.             zipOut.closeArchiveEntry();// it is necessary  
  47.         }  
  48.         zipOut.flush();  
  49.         zipOut.finish();  
  50.         zipOut.close();  
  51.     }  

 上述代码见类:com.common.util.CompressZipUtil

项目名:zip_mgmt

项目源代码见附件:zip_mgmt.zip

项目使用maven 构建

IDE:eclipse

依赖的jar包:(1)io0007-find_progess-0.0.8-SNAPSHOT.jar

(2)is_chinese

学习笔记见附件java zip压缩.zip

 

 

参考:http://m.blog.csdn.net/blog/buyaore_wo/7047343

http://www.cnblogs.com/un4sure/archive/2011/09/27/2193298.html,

http://hw1287789687.iteye.com/blog/1976309

 

时间: 2024-10-04 01:44:56

java zip解压缩的相关文章

Java解压缩zip - 解压缩多个文件或文件夹实例_java

Java解压缩zip - 多个文件(包括文件夹),具体如下: 对多个文件和文件夹进行压缩,对复杂的文件目录进行解压. 压缩方法使用的是可变参数,可以压缩1到多个文件..可以写数组的方式或者一个个写到参数列表里面... ZipFiles(zip,"abc",new File("d:/English"),new File("d:/发放数据.xls")); 测试文件目录结构: 测试的压缩内容:English文件夹和同级的两个excel文件 File[]

Mac 解压zip文件错误:无法将&quot;*.zip&quot;解压缩到&quot;&quot; (错误 1-操作不被允许)

错误提示:   无法将"*.zip"解压缩到"" (错误 1-操作不被允许)或者 解压缩失败   英文提示: "Unable to unarchive into file path" (Error 1 - Operation not permitted.) or "Decompression Failed" 结局方法:   用终端unzip 命令进行解压:   打开终端(Terminal),输入unzip 然后拖拽zip文件到

Java Zip文件解压缩

为了解压缩zip都折腾两天了,查看了许多谷歌.百度来的code, 真实无语了,绝大多数是不能用的.这可能跟我的开发环境有关吧. 我用的是Ubuntu14.04,eclipse 用的是STS3.5,jdk81.8.0_20 经过两天的努力检验了无数的code终于让我找到一个还能用的可以解决中文乱码问题. 这个项目用maven构建的依赖jar坐标如下 <!-- 用于zip文件解压缩 --> <dependency> <groupId>ant</groupId>

Java 文件解压缩实现代码_java

Java实现压缩文件的解压缩操作,缺点是压缩文件内不能含有文件名为中文的的文件,否则会出现如下错误: 复制代码 代码如下: Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED at java.util.zip.ZipCoder.toString(Unknown Source) at java.util.zip.ZipInputStream.readLOC(Unknown Source) at

php的zip解压缩类pclzip使用示例

 PclZip是一个很强大的压缩与解压缩zip文件的PHP类,这篇文章主要介绍了PclZip的使用方法 PclZip简介 PclZip是一个很强大的压缩与解压缩zip文件的PHP类,PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip.PKZIP):且能对此类类档案进行处理,包括产生压缩档.列出压缩档的内容以及解压缩档案等等.   简单.易用.强大是我对它的评价.   最近在开发我的Wordpress插件ShareLink,在这过程中,发现了PclZip这个操作zip文件

php的zip解压缩类pclzip使用示例_php实例

PclZip简介PclZip是一个很强大的压缩与解压缩zip文件的PHP类,PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip.PKZIP):且能对此类类档案进行处理,包括产生压缩档.列出压缩档的内容以及解压缩档案等等. 简单.易用.强大是我对它的评价. 最近在开发我的Wordpress插件ShareLink,在这过程中,发现了PclZip这个操作zip文件的PHP类,不得不推荐下. 还有另外一个推荐的原因就是在它的源码里面让我发现了一个PHP函数参数的淫荡用法.下面将

apache ant进行zip解压缩操作示例分享_java

需要导入ant.jar包,apache网站(http://ant.apache.org/bindownload.cgi)下载即可. 复制代码 代码如下: import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOEx

java用Zip进行多文件保存

提供了Zip支持的Java 1.1库显得更加全面.利用它可以方便地保存多个文件.甚至有一个独立的类来简化对Zip文件的读操作.这个库采采用的是标准Zip格式,所以能与当前因特网上使用的大量压缩.解压工具很好地协作.下面这个例子采取了与前例相同的形式,但能根据我们需要控制任意数量的命令行参数.除此之外,它展示了如何用Checksum类来计算和校验文件的"校验和"(Checksum).可选用两种类型的Checksum:Adler32(速度要快一些)和CRC32(慢一些,但更准确).   /

Java 解压缩助手

我使用Java swing做了一个zip解压缩助手,界面如下: 使用的依赖包:   为什么不用java 自带的ZipUtil呢?因为 没有乱码问题. 技术问题 一,如何使窗口居中? Java代码   Dimension   screensize   =   Toolkit.getDefaultToolkit().getScreenSize();             setSize(600, 280);             Dimension   framesize   =   getSi