ZIP解压缩文件的工具类【支持多级文件夹|全】
作者:Vashon
网上有非常多的加压缩演示样例代码。可是都仅仅是支持一级文件夹的操作。假设存在多级文件夹的话就不行了。
本解压缩工具类经过多次检查及重构,终于分享给大家。
package com.ywx.ziputils; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream; /**
* ZIP解压缩文件的工具类,文件能够是多级文件夹的结构进行解压,压缩操作.
* @author yangwenxue(Vashon)
*
*/
public class ZipUtil {
/**
* 压缩文件操作
* @param filePath 要压缩的文件路径
* @param descDir 压缩文件的保存路径
* @throws IOException
*/
public static void zipFiles(String filePath,String descDir) throws IOException{
ZipOutputStream zos=null;
try {
//创建一个zip输出流
zos=new ZipOutputStream(new FileOutputStream(descDir));
//启动压缩
startZip(zos,"",filePath);
System.out.println("=============压缩完成=============");
} catch (FileNotFoundException e) {
//压缩失败。则删除创建的文件
File zipFile=new File(descDir);
if(zipFile.exists()){
zipFile.delete();
}
e.printStackTrace();
}finally{
if(zos!=null){
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 对文件夹中全部文件递归遍历进行压缩
* @param zos 压缩输出流
* @param oppositePath 在zip文件里的相对路径
* @param filePath 要压缩的文件路径
* @throws IOException
*/
private static void startZip(ZipOutputStream zos, String oppositePath,
String filePath) throws IOException {
File file=new File(filePath);
if(file.isDirectory()){//假设是压缩文件夹
File[] files=file.listFiles();//列出全部文件夹
for(int i=0;i<files.length;i++){
File aFile=files[i];
if(aFile.isDirectory()){//假设是文件夹,改动相对地址
String newoppositePath=oppositePath+aFile.getName()+"/";
//压缩文件夹。这是关键,创建一个文件夹的条目时。须要在文件夹名后面加多一个"/"
ZipEntry entry=new ZipEntry(newoppositePath);
zos.putNextEntry(entry);
zos.closeEntry();
startZip(zos, newoppositePath, aFile.getPath());
}else{//假设不是文件夹,则进行压缩
zipFile(zos,oppositePath,aFile);
}
}
}else{//假设是压缩文件,直接调用压缩方法进行压缩
zipFile(zos, oppositePath, file);
}
}
/**
* 压缩单个文件到文件夹中
* @param zos zip输出流
* @param oppositePath 在zip文件里的相对路径
* @param file 要压缩的文件
*/
private static void zipFile(ZipOutputStream zos, String oppositePath, File file) {
//创建一个zip条目,每一个zip条目都必须是相对于跟路径
InputStream is=null; try {
ZipEntry entry=new ZipEntry(oppositePath+file.getName());
//将条目保存到zip压缩文件其中
zos.putNextEntry(entry);
//从文件输入流其中读取数据,并将数据写到输出流其中
is=new FileInputStream(file);
//====这样的压缩速度非常快
int length=0;
int bufferSize=1024;
byte[] buffer=new byte[bufferSize]; while((length=is.read(buffer, 0, bufferSize))>=0){
zos.write(buffer, 0, length);
} //===============下面压缩速度非常慢=================
// int temp=0;
//
// while((temp=is.read())!=-1){
// zos.write(temp);
// }
//==========================================
zos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 解压文件操作
* @param zipFilePath zip文件路径
* @param descDir 解压出来的文件保存的文件夹
*/
public static void unZiFiles(String zipFilePath,String descDir){
File zipFile=new File(zipFilePath);
File pathFile=new File(descDir); if(!pathFile.exists()){
pathFile.mkdirs();
}
ZipFile zip=null;
InputStream in=null;
OutputStream out=null; try {
zip=new ZipFile(zipFile);
Enumeration<?> entries=zip.entries();
while(entries.hasMoreElements()){
ZipEntry entry=(ZipEntry) entries.nextElement();
String zipEntryName=entry.getName();
in=zip.getInputStream(entry); String outPath=(descDir+"/"+zipEntryName).replace("\\*", "/");
//推断路径是否存在,不存在则创建文件路径
File file=new File(outPath.substring(0, outPath.lastIndexOf('/')));
if(!file.exists()){
file.mkdirs();
}
//推断文件全路径是否为文件夹,假设是上面已经创建,不须要解压
if(new File(outPath).isDirectory()){
continue;
}
out=new FileOutputStream(outPath); byte[] buf=new byte[4*1024];
int len;
while((len=in.read(buf))>=0){
out.write(buf, 0, len);
}
in.close(); System.out.println("==================解压完成==================");
}
} catch (Exception e) {
System.out.println("==================解压失败==================");
e.printStackTrace();
}finally{
try {
if(zip!=null){
zip.close();
}
if(in!=null){
in.close();
}
if(out!=null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("static-access")
public static void main(String args[]) throws IOException{
// long startTimes=System.currentTimeMillis();
// new ZipUtil().zipFiles("f:"+File.separator+"Vashon2Xiaoai", "f:"+File.separator+"Vashon2Xiaoai_vvv.zip");
// long times=System.currentTimeMillis()-startTimes;
// System.out.println("耗时:"+times/1000+"秒");
new ZipUtil().unZiFiles("f:"+File.separator+"Vashon2Xiaoai_vvv.zip", "f:"+File.separator+"vvvvss");
}
}
实践出真知,希望广大读者动手操作。如问题能够反馈。共同探讨。。。
ZIP解压缩文件的工具类【支持多级文件夹|全】的更多相关文章
- 文件读取工具类读取properties文件
1.创建工具类 import java.io.IOException; import java.util.Properties; /** * * 类名称:PropertiesUtil * 类描述: 文 ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper
FileSortHelper的核心功能就是,对文件集合FileInfo排序.FileInfo有若干字段,根据字段定义了4种比较器Comparator.调用示例:Collections.sort(Lis ...
- ZIP解压缩文件的工具类【支持多级目录|全】
ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...
- 文件类型工具类:FileTypeUtil
个人学习,仅供参考! package com.example.administrator.filemanager.utils;import java.io.File;/** * 文件类型工具类 * * ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- 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 ...
- 写文件的工具类,输出有格式的文件(txt、json/csv)
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...
- Java 文件切割工具类
Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
随机推荐
- k-mean聚类学习笔记
才发现k-means 聚类这么简单,-_-|| 首先讲一下最朴素的k-means, 首先k-means 是一个迭代过程. 所以我们需要先确定初始,最简单的一个办法就是随机从样本中抽取k个出来,作为初始 ...
- python for循环及常用函数
python for循环 格式: for iterating_var in sequence: statements(s) ###################################### ...
- python标准库:Configparser模块
配置文件test.conf [section1] name = tank age = 28 [section2] ip = 192.168.1.1 port = 8080 示例 # -* - codi ...
- C#反射(Reflection)详解
1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...
- Color.FromArgb()方法详解
关于颜色值的表示 常用的颜色值表示方式有两种,一种是10进制的RGB值表示,如(0,113,255),三个值分别表示(红,绿,蓝):一种是16进制的颜色码表示,如#ff3212.这两种形式在编程中都可 ...
- 点击添加按钮,使用ajax动态添加一行和移除一行,并且序号重新排序和数据不重复操作判断
<div class="control-group " style="top: -20px;position: relative;"> <la ...
- 提高Android Studio运行、编译速度方案
1.安装完成后启动卡死 刚刚打开studio就卡在gradle building的界面再也不动了(去连接墙外的网下载),那么这个时候我们就需要把这个联网下载操作屏蔽掉,找到studio安装目录,找到i ...
- Java IO 学习(三)缓冲IO / 直接IO / 内存映射
缓冲IO 在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点 一个机械硬盘中装有多个盘片 每个盘片上有多个同心圆(磁道) 每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说5 ...
- 记一个react拖动排序中的坑:key
在做一个基于react的应用的时候遇到了对列表拖动排序的需求.当使用sortable对列表添加排序支持后发现一个问题:数据正确排序了,但是dom的顺序却乱了,找了一会儿原因后发现是因为在渲染数据的时候 ...
- 页面css代码
博主原来的页面css代码 (这个是原来的那种效果,差不多弄出来会是这种效果http://www.cnblogs.com/thmyl/) /*simplememory*/ #google_ad_c1, ...