import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
public class ZIPUtil {
public final static int BUFFER_SIZE = 1024 * 8;
/**
* 打成zip压缩包
* @param dirPath 源文件夹路径
* @param toZipPath 解压后存放文件目录
*/
public static void doZip(String dirPath, String toZipPath) {
File dir = null;
ZipOutputStream zipOut = null;
String zipDirName = ""; //存储生成的zip包的路径
String parentPath = null;
try {
dir = new File(dirPath);
zipDirName = getZipPath(dir.getName(), toZipPath);
parentPath = dir.getParent();
zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipDirName)));
doZipHandlerDir(dir, zipOut, parentPath);
zipOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获得zip存储路径
* @param dirName
* @param toZipPath
* @return
*/
private static String getZipPath(String dirName, String toZipPath) {
String zipDirName = "";
if (toZipPath != null && !"".equals(toZipPath.trim())) {
zipDirName = toZipPath + File.separator;
File newDir = new File(zipDirName);
if (!newDir.exists()) {
newDir.mkdirs();
}
}
zipDirName += dirName + ".zip";
return zipDirName;
}
/**
* 递归完成目录下文件读取
* @param dir
* @param zipOut
* @throws Exception
*/
private static void doZipHandlerDir(File dir, ZipOutputStream zipOut, String parentPath) throws Exception {
File[] files = dir.listFiles();//获得目录下的所有文件(包括目录和文件)
byte[] buffer = new byte[BUFFER_SIZE];//缓存大小
if (files.length == 0) {//如果目录为空另行创建
zipOut.putNextEntry(new ZipEntry(handlerFilePath(dir.toString(),parentPath)+File.separator));
zipOut.closeEntry();
} else {//如果目录下不为空 则分别处理目录和文件
for (File file : files) {
if (file.isDirectory()) {//目录情况递归遍历
doZipHandlerDir(file, zipOut, parentPath);
} else {//文件情况读文件 并写入到zip包中
doZipWriteFile(file, zipOut, parentPath, buffer);
}
}
}
}
/**
* 向zip包中写入文件
* @param file 文件对象
* @param zipOut zip输出流
* @param parentPath 父目录路径
* @param buffer 缓存
* @throws Exception 向上抛出异常
*/
private static void doZipWriteFile(File file, ZipOutputStream zipOut, String parentPath, byte[] buffer) throws Exception {
FileInputStream fis = new FileInputStream(file);
zipOut.putNextEntry(new ZipEntry(handlerFilePath(file.toString(), parentPath)));
int length = 0;//读取字节长度
while ((length = fis.read(buffer)) > 0) {
zipOut.write(buffer, 0, length);
}
zipOut.closeEntry();
fis.close();
}
/**
* 处理路径 将绝对路径处理成相对路径 否则zip包中会出现绝对路径下的每一层目录
* @param realPath 绝度路径
* @param parentPath 需要去掉的父路径
* @return 处理后的相对路径
* @throws Exception 找不到父路径时抛出异常
*/
private static String handlerFilePath(String realPath, String parentPath) throws Exception {
int index = -1;
index = realPath.indexOf(parentPath);
if (index == -1) {
throw new Exception("路径错误");
}
return realPath.substring(index + parentPath.length());
}
/**
* 解压缩文件
* @param unZipPath 要解压缩的zip文件路径 (路径+文件名)
* @param toUnZipPath 解压后存放的路径
*/
public static void unZip(String unZipPath, String toUnZipPath) {
ZipFile zipFile = null;
FileOutputStream outStream = null;
InputStream inputStream = null;
File file = null;
try {
zipFile = new ZipFile(unZipPath);
for (Enumeration entities = zipFile.getEntries(); entities.hasMoreElements();) {//遍历zip包下的zip条目
ZipEntry zipEntry = (ZipEntry) entities.nextElement();
file = new File(getUnZipPath(zipEntry.getName(), toUnZipPath));
mkdirs(zipEntry, file);
inputStream = zipFile.getInputStream(zipEntry);//从zip条目获得输入流
outStream = new FileOutputStream(file);//获得写入磁盘的输出流
write2Disk(outStream, inputStream);
}
zipFile.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (outStream != null) {
outStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 解压过程中创建目录
* @param zipEntry zip条目
* @param file 解压的文件夹或者文件
*/
private static void mkdirs(ZipEntry zipEntry, File file) {
if (zipEntry.isDirectory()) {
file.mkdirs();
} else {
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
}
}
/**
* 解压后写到磁盘
* @param outStream 输出流
* @param inputStream 读文件的输入流
* @throws IOException io异常
*/
private static void write2Disk(FileOutputStream outStream, InputStream inputStream) throws IOException {
int length = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while ((length = inputStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
outStream.flush();
outStream.close();
inputStream.close();
}
/**
* 获得解压后存放路径
* @param zipName zip条目名
* @param toUnZipPath 解压路径
* @return
*/
private static String getUnZipPath(String zipName, String toUnZipPath) {
String unZipPath = "";//解压后存储路径
if (toUnZipPath != null && !"".equals(toUnZipPath)) {
unZipPath = toUnZipPath + File.separator;
}
unZipPath += zipName;
return unZipPath;
}
public static void main(String[] args) {
unZip("C:/1.zip", "C:/123");
}
}
相关推荐
标题中的"findbugs压缩包+findbugs.jar+findbugs-ant.jar"指的是该压缩文件内包含FindBugs的主要库文件`findbugs.jar`,这是执行FindBugs分析的核心组件,它包含了各种检测规则和算法。另外,`findbugs-ant.jar`则是...
"jar.zip包下载"指的是用户可以从某个源下载这个压缩包,这通常是为了方便开发者在本地环境中使用Ant ZIP任务,而无需手动编译源代码。依赖包是指在运行或构建项目时,需要的其他外部库或组件,"ant-zip-1.7.1.jar...
在AntTask.jar.zip压缩包中,我们还发现了ant.license.txt文件。这通常意味着该库遵循特定的开源许可协议,允许开发者在遵守协议条款的情况下自由使用、修改和分发AntTask.jar。阅读这个文件对于理解使用限制和责任...
标题中的"ant-eclipse.jar.zip"表明这是一个包含“ant-eclipse.jar”文件的压缩包,主要用于在Eclipse集成开发环境中使用Ant构建工具。Ant是Apache软件基金会的一个项目,它是一个基于Java的构建工具,类似于Make,...
本文将详细介绍“ant-dependencies.jar.zip”这个压缩包,以及其中包含的文件“ant-dependencies.jar”和“ant.license.txt”。 一、Ant简介 Apache Ant,是一个由Apache软件基金会开发的Java库和命令行工具,其...
例如,`<javac>`任务用于编译Java源代码,`<jar>`任务则用于创建JAR文件,这正是我们在压缩包中看到的`ant-1.6.5.jar`文件。 `ant-1.6.5.jar`是Ant 1.6.5的主库,包含了所有执行构建任务所需的类和资源。这个JAR...
总之,`antlr3-ant.jar.zip`提供了一种便捷的方式,让Java开发者能够将ANTLR 3的语法解析能力整合到Apache Ant构建环境中,从而简化和自动化解析器和词法分析器的生成过程。通过遵循提供的许可协议并正确配置Ant构建...
在描述中提到了"jar.zip包下载",这通常指的是Ant-Launcher.jar被封装在一个名为"ant-launcher.jar.zip"的zip文件中,便于用户下载和分发。这种做法减少了文件体积,便于在网络上传输,同时简化了用户的安装和管理...
总结起来,"ant-installer.jar.zip"提供了安装Ant所需的所有组件,通过运行"ant-installer.jar"即可快速部署。Ant作为一个强大的构建工具,通过XML配置文件实现自动化构建流程,包括编译、测试、打包等,同时支持...
总的来说,"ant-antlr.jar.zip"是Java开发中的一个重要工具集,它结合了Ant的构建能力和ANTLR的语法解析能力,为开发者提供了强大的项目管理和语言处理功能。理解并熟练运用这两个工具,能够提升Java项目的开发效率...
《Ant 1.5.jar.zip:构建自动化工具的深度解析》 在软件开发过程中,自动化构建工具扮演着至关重要的角色,它们能够简化繁琐的手动编译、测试和部署任务。Ant,作为Apache软件基金会的一个开源项目,是Java环境中...
标题中的"ant-bootstrap.jar.zip"是一个压缩文件,它包含了与Apache Ant和Bootstrap相关的资源。Apache Ant是一个由Apache软件基金会开发的Java库和命令行工具,主要用于构建Java项目。它的核心概念是基于XML的构建...
在`ant-icontract.jar.zip`这个压缩包中,`ant-icontract.jar`是一个包含Ant扩展的库,它为Ant添加了对Icontract的支持。Icontract是一个强大的Java库,用于实现设计-by-contract编程。设计-by-contract是一种编程...
在描述中提到的“jar.zip包下载”可能指的是Ant Task 1.3.2.jar被封装在了一个名为“ant-task-1.3.2.jar.zip”的压缩文件中,这种做法常见于软件分发,方便用户下载并解压后直接使用。同时,压缩包内的“ant.license...
“ant-javamail.jar.zip”这个压缩包就是Ant与JavaMail整合的一个体现,它包含了两个关键文件:ant-javamail.jar和ant.license.txt。ant-javamail.jar是Ant的扩展库,提供了对JavaMail的支持,使得Ant任务能够执行...
标题中的"ant-netrexx.jar.zip"是一个压缩文件,它包含了一个名为"ant-netrexx.jar"的Java档案(JAR)文件以及一个名为"ant.license.txt"的许可协议文本文件。这个压缩包主要与Apache Ant项目相关,Ant是一个在Java...
在压缩包`ant-launcher-1.7.0.jar.zip`中,除了`ant-launcher-1.7.0.jar`之外,还有一个名为`ant.license.txt`的文件。这通常是开源软件的许可证文件,详细说明了Ant的许可协议,例如Apache License 2.0。遵守这些...
在实际应用中,"ant-antlr-1.6.4.jar.zip"的使用流程通常是这样的:首先,开发者需要将压缩包解压,将"ant-antlr-1.6.4.jar"添加到Ant的类路径中;然后,在build.xml文件中定义一个ANTLR任务,指定输入语法文件和...
### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....
《Ant Schematron与Jar.zip包的解析及应用》 在IT行业中,构建自动化工具的使用至关重要,Apache Ant就是其中的佼佼者。本篇文章将深入探讨Ant Schematron库的使用,以及如何通过"ant-schematron.jar.zip"这个...