`
PrinceXR
  • 浏览: 12854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

解析zip压缩包 附件中提供ant.jar

阅读更多

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-ant.jar"指的是该压缩文件内包含FindBugs的主要库文件`findbugs.jar`,这是执行FindBugs分析的核心组件,它包含了各种检测规则和算法。另外,`findbugs-ant.jar`则是...

    ant-zip-1.7.1.jar.zip

    "jar.zip包下载"指的是用户可以从某个源下载这个压缩包,这通常是为了方便开发者在本地环境中使用Ant ZIP任务,而无需手动编译源代码。依赖包是指在运行或构建项目时,需要的其他外部库或组件,"ant-zip-1.7.1.jar...

    antTask.jar.zip

    在AntTask.jar.zip压缩包中,我们还发现了ant.license.txt文件。这通常意味着该库遵循特定的开源许可协议,允许开发者在遵守协议条款的情况下自由使用、修改和分发AntTask.jar。阅读这个文件对于理解使用限制和责任...

    ant-eclipse.jar.zip

    标题中的"ant-eclipse.jar.zip"表明这是一个包含“ant-eclipse.jar”文件的压缩包,主要用于在Eclipse集成开发环境中使用Ant构建工具。Ant是Apache软件基金会的一个项目,它是一个基于Java的构建工具,类似于Make,...

    ant-dependencies.jar.zip

    本文将详细介绍“ant-dependencies.jar.zip”这个压缩包,以及其中包含的文件“ant-dependencies.jar”和“ant.license.txt”。 一、Ant简介 Apache Ant,是一个由Apache软件基金会开发的Java库和命令行工具,其...

    ant-1.6.5.jar.zip

    例如,`<javac>`任务用于编译Java源代码,`<jar>`任务则用于创建JAR文件,这正是我们在压缩包中看到的`ant-1.6.5.jar`文件。 `ant-1.6.5.jar`是Ant 1.6.5的主库,包含了所有执行构建任务所需的类和资源。这个JAR...

    antlr3-ant.jar.zip

    总之,`antlr3-ant.jar.zip`提供了一种便捷的方式,让Java开发者能够将ANTLR 3的语法解析能力整合到Apache Ant构建环境中,从而简化和自动化解析器和词法分析器的生成过程。通过遵循提供的许可协议并正确配置Ant构建...

    ant-launcher.jar.zip

    在描述中提到了"jar.zip包下载",这通常指的是Ant-Launcher.jar被封装在一个名为"ant-launcher.jar.zip"的zip文件中,便于用户下载和分发。这种做法减少了文件体积,便于在网络上传输,同时简化了用户的安装和管理...

    ant-installer.jar.zip

    总结起来,"ant-installer.jar.zip"提供了安装Ant所需的所有组件,通过运行"ant-installer.jar"即可快速部署。Ant作为一个强大的构建工具,通过XML配置文件实现自动化构建流程,包括编译、测试、打包等,同时支持...

    ant-antlr.jar.zip

    总的来说,"ant-antlr.jar.zip"是Java开发中的一个重要工具集,它结合了Ant的构建能力和ANTLR的语法解析能力,为开发者提供了强大的项目管理和语言处理功能。理解并熟练运用这两个工具,能够提升Java项目的开发效率...

    ant-1.5.jar.zip

    《Ant 1.5.jar.zip:构建自动化工具的深度解析》 在软件开发过程中,自动化构建工具扮演着至关重要的角色,它们能够简化繁琐的手动编译、测试和部署任务。Ant,作为Apache软件基金会的一个开源项目,是Java环境中...

    ant-bootstrap.jar.zip

    标题中的"ant-bootstrap.jar.zip"是一个压缩文件,它包含了与Apache Ant和Bootstrap相关的资源。Apache Ant是一个由Apache软件基金会开发的Java库和命令行工具,主要用于构建Java项目。它的核心概念是基于XML的构建...

    ant-icontract.jar.zip

    在`ant-icontract.jar.zip`这个压缩包中,`ant-icontract.jar`是一个包含Ant扩展的库,它为Ant添加了对Icontract的支持。Icontract是一个强大的Java库,用于实现设计-by-contract编程。设计-by-contract是一种编程...

    ant-task-1.3.2.jar.zip

    在描述中提到的“jar.zip包下载”可能指的是Ant Task 1.3.2.jar被封装在了一个名为“ant-task-1.3.2.jar.zip”的压缩文件中,这种做法常见于软件分发,方便用户下载并解压后直接使用。同时,压缩包内的“ant.license...

    ant-javamail.jar.zip

    “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.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.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.zip"的使用流程通常是这样的:首先,开发者需要将压缩包解压,将"ant-antlr-1.6.4.jar"添加到Ant的类路径中;然后,在build.xml文件中定义一个ANTLR任务,指定输入语法文件和...

    JAVA解压ZIP多层目录文件(需ant.jar

    ### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....

    ant-schematron.jar.zip

    《Ant Schematron与Jar.zip包的解析及应用》 在IT行业中,构建自动化工具的使用至关重要,Apache Ant就是其中的佼佼者。本篇文章将深入探讨Ant Schematron库的使用,以及如何通过"ant-schematron.jar.zip"这个...

Global site tag (gtag.js) - Google Analytics