文档章节

JAVA对文件的解压缩操作(利用java.util.zip*下的类)

奔跑的码农
 奔跑的码农
发布于 2017/02/25 10:18
字数 584
阅读 96
收藏 3
/**
 * Created by WangShiXiang on 2017/2/25.
 */
public class Zip {
    /**
     * 用来压缩单个文件
     * @param filepath 源文件路径
     * @param zippath 压缩完成后存放的路径
     */
    public static void addZipFile(String filepath,String zippath){
        File file=new File(filepath);
        File zipFile=new File(zippath);
        try {
            FileInputStream in=new FileInputStream(file);
            ZipOutputStream zipOut=new ZipOutputStream(new FileOutputStream(zipFile));
            zipOut.putNextEntry(new ZipEntry(file.getName()));
            byte[] buf=new byte[8*1024];
            int b;
            while((b=in.read(buf,0,buf.length))!=-1){
                zipOut.write(buf, 0, b);
            }
            in.close();
            zipOut.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /**
     * 用来压缩一个文件夹里的所有内容,就是常规的文件压缩
     * @param filepath 文件或者文件夹的路径
     * @param zippath 生成ZIP文件的路径
     * @param dirFlg 是否包含当前的文件夹
     */
    public static void zipMuitFile(String filepath,String zippath,boolean dirFlg){

        try {
            File file=new File(filepath);
            File zipFile=new File(zippath);
            ZipOutputStream zipOut=new ZipOutputStream(new FileOutputStream(zipFile));
            if(file.isDirectory()){
                File[] files=file.listFiles();
                for(File fileSec:files){
                    if(dirFlg){
                        recursionZip(zipOut,fileSec,file.getName()+File.separator);
                    }else{
                        recursionZip(zipOut,fileSec,file.getName()+"");
                    }
                }
            }
            zipOut.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 用来对文件的递归操作压缩
     * @param zipOut ZipOutputStream的输出流
     * @param file 文件或者文件夹的路径
     * @param baseDir 该文件在哪个文件夹下
     * @throws IOException
     */
    private static void recursionZip(ZipOutputStream zipOut,File file,String baseDir) throws IOException{
        if(file.isDirectory()){
            File[] files=file.listFiles();
            for(File fileSec:files){
                recursionZip(zipOut,fileSec,baseDir+file.getName()+File.separator);
            }
        }else{
            byte[] buf=new byte[1024*8];
            InputStream input=new FileInputStream(file);
            zipOut.putNextEntry(new ZipEntry(baseDir+file.getName()));
            int b;
            while((b=input.read(buf))!=-1){
                zipOut.write(buf, 0, b);
            }
            input.close();
        }
    }
    /**
     * 用来解压一个压缩包
     * @param zipFilePath :ZIP文件的路径
     * @param unZipFilePath :ZIP文件的输出路径
     * @param dirFlg:ZIP文件的保存路径是否包含压缩包的名字
     */

    public static void unZip(String zipFilePath,String unZipFilePath,boolean dirFlg){

        File zipFile=new File(zipFilePath);
        if(dirFlg){
            String fileName=zipFile.getName();
            if(fileName!=null&&fileName!=""){
                fileName=fileName.substring(0, fileName.lastIndexOf("."));
            }
            unZipFilePath=unZipFilePath+File.separator+fileName;
        }
        File unZipFileDir=new File(unZipFilePath);

        if(!unZipFileDir.exists()||!unZipFileDir.isDirectory()){
            unZipFileDir.mkdirs();
        }
        try {
            ZipFile zipFile_Z=new ZipFile(zipFile);
            ZipInputStream zipInput=new ZipInputStream(new FileInputStream(zipFile));
            ZipEntry entry=null;
            String entryFilePath=null;
            String entryDirPath=null;
            InputStream input=null;
            OutputStream output=null;
            File entryDir=null;
            File entryFile=null;
            int index=0;
            int content=0;
            while((entry=zipInput.getNextEntry())!=null){
                //构建压缩包中一个文件解压后保存的全路径
                entryFilePath=unZipFilePath+File.separator+entry.getName();
                //解压后保存文件的文件夹路径
                if((index=entryFilePath.lastIndexOf(File.separator))!=-1){
                    entryDirPath=entryFilePath.substring(0, index);
                }else{
                    entryDirPath="";
                }
                entryDir=new File(entryDirPath);
                //如果文件夹路径不存在,创建文件夹

                if(!entryDir.exists()||!entryDir.isDirectory()){
                    entryDir.mkdirs();
                }
                entryFile=new File(entryFilePath);
                input=new BufferedInputStream(zipFile_Z.getInputStream(entry));
                output=new BufferedOutputStream(new FileOutputStream(entryFile));
                byte[] buf=new byte[1024*8];
                while((content=input.read(buf, 0, buf.length))!=-1){
                    output.write(buf, 0, content);
                }
                output.flush();
                output.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

 

© 著作权归作者所有

共有 人打赏支持
奔跑的码农

奔跑的码农

粉丝 15
博文 31
码字总数 37901
作品 0
海淀
程序员
私信 提问
Tomcat与Jre绿色环境配置(生产环境)

Tomcat与Jre绿色环境配置(生产环境)博客分类: Apache Java jreapachetomcat Tomcat运行时需要jre的支持,一般有两种方式,一种是用jdk带的jre,另一种无需安装jdk只利用jre。这两种方式的...

thinkyoung
2015/12/31
0
0
扩展 JDT 实现自动代码注释与格式化

简介: 本文介绍了一个为 Eclipse 工作空间中的 Java 代码自动添加统一注释并格式化排版的工具及其具体实现。该工具扩展 Eclipse Java Development Tool(JDT)API,操作 Java 代码。通过本文...

红薯
2010/07/30
1K
1
淘宝Tprofiler工具实现分析

项目首页:https://github.com/alibaba/TProfiler 工具介绍 TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对...

伍咖
2015/11/14
0
0
说说在 Spring AOP 中如何实现类加载期织入(LTW)

我们可以在类加载期通过字节码编辑技术将切面织入目标类,这种方式叫做 LTW(Load Time Weaving)。 AspectJ LTW 使用 Java 5.0 提供的代理功能实现织入工作 。JDK 的代理功能能够让代理器访...

deniro
2018/08/24
0
0
以简单的方式消除 Java 的冗长

Lombok 是一种 Java Archive (JAR) 文件,可用来消除 Java 代码的冗长。 我们看这样一个例子,一个标准的 Java bean。一个典型的 Java bean 一般具有几个属性。每个属性具有一个 accessor 和...

红薯
2010/04/13
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

cnetos7+docker+rancher构建基于DevOps的全自动CI【01】

来自DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量、私有代码库与私有镜像库的应用等。 1、环境选择 安装Rancher环境,一定要在干净的...

Elson
14分钟前
0
0
21分钟教会你分析MaxCompute账单

背景 阿里云大计算服务MaxCompute是一款商业化的大数据分析平台,其计算资源有预付费和后付费两种计费方式。并且产品每天按照project为维度进行计量计费(账单基本情况下会第二天6点前产出)...

zhaowei121
17分钟前
0
0
CTO职场解惑指南系列(一)

基于科技能够改变世界的事实,几乎每个公司的程序员都自带闪光灯。程序员的手和普通人的手自然是有区别的,“我们可是用双手改变了世界” 。(码农真的是靠双手吃饭,呵呵) 这个世界上但凡靠...

阿里云云栖社区
22分钟前
0
0
css实现图片自适应容器宽高

css实现图片自适应容器宽高的做法一般如下所示 <style>div{width: 200px; height: 200px}div img{width: 100%; height: 100%}</style><div><img src="xxxx.png" /></div> 当外层容......

小草先森
22分钟前
0
0
PlatON在CentOS上编译部署

本文作者为万向区块链CTO罗荣阁。 目录 PlatON在CentOS上编译部署 1. CentOS 环境准备 1.1. 使用rpm 安装devtoolset-7 1.2. 使用rpm 安装dos2unix 1.3. 准备PlatON代码 1.4. 确保build脚本正...

万向区块链
30分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部