文档章节

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();
        }

    }
}

 

© 著作权归作者所有

共有 人打赏支持
奔跑的码农
粉丝 11
博文 25
码字总数 28867
作品 0
海淀
程序员
Tomcat与Jre绿色环境配置(生产环境)

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

thinkyoung
2015/12/31
0
0
淘宝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
08/24
0
0
【J2EE系列】JNDI与tomcat连接池

JNDI与tomcat连接池 本章内容 ² JNDI与JNDI服务器 ² 编码实现JNDI目录服务与命名服务 ² 使用Tomcate JNDI服务器 一、JNDI概述 1、什么是JNDI? 英文全称是:Java Naming and Directory Inte...

磊神Ray
2012/02/15
0
1
Java压缩技术(一) ZLib

应好友需要,整理一下Java的压缩算法,先从ZLib开始。 相关链接: Java压缩技术(一) ZLib Java压缩技术(二) ZIP压缩——Java原生实现 Java压缩技术(三) ZIP解压缩——Java原生实现 Ja...

村长大神
2014/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
0
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
33
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部