ZIP解压缩文件的工具类【支持多级文件夹|全】

作者:Vashon

网上有非常多的加压缩演示样例代码。可是都仅仅是支持一级文件夹的操作。假设存在多级文件夹的话就不行了。

本解压缩工具类经过多次检查及重构,终于分享给大家。

  1. package com.ywx.ziputils;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.util.Enumeration;
  11. import java.util.zip.ZipEntry;
  12. import java.util.zip.ZipFile;
  13. import java.util.zip.ZipOutputStream;
  14.  
  15. /**
  16. * ZIP解压缩文件的工具类,文件能够是多级文件夹的结构进行解压,压缩操作.
  17. * @author yangwenxue(Vashon)
  18. *
  19. */
  20. public class ZipUtil {
  21. /**
  22. * 压缩文件操作
  23. * @param filePath 要压缩的文件路径
  24. * @param descDir 压缩文件的保存路径
  25. * @throws IOException
  26. */
  27. public static void zipFiles(String filePath,String descDir) throws IOException{
  28. ZipOutputStream zos=null;
  29. try {
  30. //创建一个zip输出流
  31. zos=new ZipOutputStream(new FileOutputStream(descDir));
  32. //启动压缩
  33. startZip(zos,"",filePath);
  34. System.out.println("=============压缩完成=============");
  35. } catch (FileNotFoundException e) {
  36. //压缩失败。则删除创建的文件
  37. File zipFile=new File(descDir);
  38. if(zipFile.exists()){
  39. zipFile.delete();
  40. }
  41. e.printStackTrace();
  42. }finally{
  43. if(zos!=null){
  44. try {
  45. zos.close();
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }
  52. /**
  53. * 对文件夹中全部文件递归遍历进行压缩
  54. * @param zos 压缩输出流
  55. * @param oppositePath 在zip文件里的相对路径
  56. * @param filePath 要压缩的文件路径
  57. * @throws IOException
  58. */
  59. private static void startZip(ZipOutputStream zos, String oppositePath,
  60. String filePath) throws IOException {
  61. File file=new File(filePath);
  62. if(file.isDirectory()){//假设是压缩文件夹
  63. File[] files=file.listFiles();//列出全部文件夹
  64. for(int i=0;i<files.length;i++){
  65. File aFile=files[i];
  66. if(aFile.isDirectory()){//假设是文件夹,改动相对地址
  67. String newoppositePath=oppositePath+aFile.getName()+"/";
  68. //压缩文件夹。这是关键,创建一个文件夹的条目时。须要在文件夹名后面加多一个"/"
  69. ZipEntry entry=new ZipEntry(newoppositePath);
  70. zos.putNextEntry(entry);
  71. zos.closeEntry();
  72. startZip(zos, newoppositePath, aFile.getPath());
  73. }else{//假设不是文件夹,则进行压缩
  74. zipFile(zos,oppositePath,aFile);
  75. }
  76. }
  77. }else{//假设是压缩文件,直接调用压缩方法进行压缩
  78. zipFile(zos, oppositePath, file);
  79. }
  80. }
  81. /**
  82. * 压缩单个文件到文件夹中
  83. * @param zos zip输出流
  84. * @param oppositePath 在zip文件里的相对路径
  85. * @param file 要压缩的文件
  86. */
  87. private static void zipFile(ZipOutputStream zos, String oppositePath, File file) {
  88. //创建一个zip条目,每一个zip条目都必须是相对于跟路径
  89. InputStream is=null;
  90.  
  91. try {
  92. ZipEntry entry=new ZipEntry(oppositePath+file.getName());
  93. //将条目保存到zip压缩文件其中
  94. zos.putNextEntry(entry);
  95. //从文件输入流其中读取数据,并将数据写到输出流其中
  96. is=new FileInputStream(file);
  97. //====这样的压缩速度非常快
  98. int length=0;
  99. int bufferSize=1024;
  100. byte[] buffer=new byte[bufferSize];
  101.  
  102. while((length=is.read(buffer, 0, bufferSize))>=0){
  103. zos.write(buffer, 0, length);
  104. }
  105.  
  106. //===============下面压缩速度非常慢=================
  107. // int temp=0;
  108. //
  109. // while((temp=is.read())!=-1){
  110. // zos.write(temp);
  111. // }
  112. //==========================================
  113. zos.closeEntry();
  114. } catch (IOException e) {
  115. e.printStackTrace();
  116. }finally{
  117. if(is!=null){
  118. try {
  119. is.close();
  120. } catch (IOException e) {
  121. e.printStackTrace();
  122. }
  123. }
  124. }
  125. }
  126. /**
  127. * 解压文件操作
  128. * @param zipFilePath zip文件路径
  129. * @param descDir 解压出来的文件保存的文件夹
  130. */
  131. public static void unZiFiles(String zipFilePath,String descDir){
  132. File zipFile=new File(zipFilePath);
  133. File pathFile=new File(descDir);
  134.  
  135. if(!pathFile.exists()){
  136. pathFile.mkdirs();
  137. }
  138. ZipFile zip=null;
  139. InputStream in=null;
  140. OutputStream out=null;
  141.  
  142. try {
  143. zip=new ZipFile(zipFile);
  144. Enumeration<?> entries=zip.entries();
  145. while(entries.hasMoreElements()){
  146. ZipEntry entry=(ZipEntry) entries.nextElement();
  147. String zipEntryName=entry.getName();
  148. in=zip.getInputStream(entry);
  149.  
  150. String outPath=(descDir+"/"+zipEntryName).replace("\\*", "/");
  151. //推断路径是否存在,不存在则创建文件路径
  152. File file=new File(outPath.substring(0, outPath.lastIndexOf('/')));
  153. if(!file.exists()){
  154. file.mkdirs();
  155. }
  156. //推断文件全路径是否为文件夹,假设是上面已经创建,不须要解压
  157. if(new File(outPath).isDirectory()){
  158. continue;
  159. }
  160. out=new FileOutputStream(outPath);
  161.  
  162. byte[] buf=new byte[4*1024];
  163. int len;
  164. while((len=in.read(buf))>=0){
  165. out.write(buf, 0, len);
  166. }
  167. in.close();
  168.  
  169. System.out.println("==================解压完成==================");
  170. }
  171. } catch (Exception e) {
  172. System.out.println("==================解压失败==================");
  173. e.printStackTrace();
  174. }finally{
  175. try {
  176. if(zip!=null){
  177. zip.close();
  178. }
  179. if(in!=null){
  180. in.close();
  181. }
  182. if(out!=null){
  183. out.close();
  184. }
  185. } catch (IOException e) {
  186. e.printStackTrace();
  187. }
  188. }
  189. }
  190. @SuppressWarnings("static-access")
  191. public static void main(String args[]) throws IOException{
  192. // long startTimes=System.currentTimeMillis();
  193. // new ZipUtil().zipFiles("f:"+File.separator+"Vashon2Xiaoai", "f:"+File.separator+"Vashon2Xiaoai_vvv.zip");
  194. // long times=System.currentTimeMillis()-startTimes;
  195. // System.out.println("耗时:"+times/1000+"秒");
  196. new ZipUtil().unZiFiles("f:"+File.separator+"Vashon2Xiaoai_vvv.zip", "f:"+File.separator+"vvvvss");
  197. }
  198. }

实践出真知,希望广大读者动手操作。如问题能够反馈。共同探讨。。。

ZIP解压缩文件的工具类【支持多级文件夹|全】的更多相关文章

  1. 文件读取工具类读取properties文件

    1.创建工具类 import java.io.IOException; import java.util.Properties; /** * * 类名称:PropertiesUtil * 类描述: 文 ...

  2. 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper

    FileSortHelper的核心功能就是,对文件集合FileInfo排序.FileInfo有若干字段,根据字段定义了4种比较器Comparator.调用示例:Collections.sort(Lis ...

  3. ZIP解压缩文件的工具类【支持多级目录|全】

    ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...

  4. 文件类型工具类:FileTypeUtil

    个人学习,仅供参考! package com.example.administrator.filemanager.utils;import java.io.File;/** * 文件类型工具类 * * ...

  5. Android开发调试日志工具类[支持保存到SD卡]

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

  6. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  7. 写文件的工具类,输出有格式的文件(txt、json/csv)

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  8. Java 文件切割工具类

    Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...

  9. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

随机推荐

  1. Java抽象类,接口,抽象方法

    创建Animal抽象类 public abstract class Animal { public abstract void eat(); public abstract void sleep(); ...

  2. 使用git快捷方便的保存代码

    大家都在使用git保存和备份代码,下面我们就来学习下吧. 一.本地安装和配置git 1.安装git pacman -S git //如果没有问题的话就可以安装成功了 2.验证 git --versio ...

  3. AC日记——K-th Number poj 2104

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 52348   Accepted: 17985 Ca ...

  4. Jenkins集成java非maven/ant项目的打包思路

    打包的思路如下: 1.使用javac命令对代码进行编译,比如递归编译整个项目的java代码.(注意:需要一一对应引用的jar包) 2.输出并整理war包的文件夹结构目录,参考:http://www.c ...

  5. SecureCRT介绍、安装、使用(转)

    http://blog.csdn.net/liang19890820/article/details/49701429 简介 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简 ...

  6. 深入浅出 Cocoa 之 Core Data(1)- 框架详解

    深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...

  7. 一种全新的自动调用ajax方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. VS2010 MFC中 单独添加ODBC数据库记录集类(CRecordset)方法

    基于VS2010 MFC的项目是之前建好的,后来需要添加数据库. 方法分享于此. 1.  打开自己的项目,项目->添加类. 2. 选MFC ODBC使用者,点右下角的添加. 3. 点数据源. / ...

  9. 防止sql注入和跨站脚本攻击,跨站请求伪造以及一句话木马的学习记录

    以下是来自精通脚本黑客的学习记录 防止以上漏洞的最好的方式 一对用户的输入进行编码,对用户输入进行编码,然后存入数据库,取出时解码成utf-8 二对用户的输入进行过滤,过滤jscript,javasc ...

  10. 转: scala语言的简单入门 (IBM develop)

    转: https://www.ibm.com/developerworks/cn/java/j-lo-funinscala2/