Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

 更新时间:2023年10月18日 10:45:55   作者:狂奔的蜗牛已被占用  
这篇文章主要给大家介绍了关于Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream的相关资料,ZipInputStream 和 ZipOutputStream 可以用于处理 ZIP文件格式,文中通过代码介绍的非常详细,需要的朋友可以参考下

文件压缩 ZipOutputStream

用ZipOutputStream来压缩一个文件夹时,要搭配ZipEntry来使用。ZipEntry是用来创建压缩文件的。

举个例子,向压缩文件中添加一个文件的代码:

//zipOut:压缩文件的路径
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOut));
//zipOutputStream.putNextEntry()  ====> 向压缩包中添加一个文件
//new ZipEntry("text1.txt") ======⇒ zip压缩包中文件都是用ZipEntry对象,
//"text1.txt"===》是文件在压缩文件的路径,text1.txt表示在压缩文件的根路径

zipOutputStream.putNextEntry(new ZipEntry("text1.txt"));

如下图:

在创建ZipEntry对象时可以指定文件在压缩包的位置:new ZipEntry(“second-dir\second-01.txt”)

在使用ZipOutputStream压缩文件时要注意的地方就是这些,下面给一个压缩文件的代码:

    static final int  BUFFER_SIZE = 4 << 10;
    /**
     * 压缩指定目录下的所有文件
     * @param dir 指定压缩目录
     * @param destZipName 指定压缩包名字
     */
    public void zip(String dir,String zipPath,String destZipName) throws IOException {
        File file = new File(dir);
        /**1.为zip文件创建目录*****/
        String path = file.getParentFile().getAbsolutePath();
        if(isNull(destZipName))destZipName = file.getName()+".zip";
        if(isNull(zipPath)) zipPath = path;
        String zipOut = zipPath + File.separator + destZipName;
        File zipOutFile = new File(zipOut);
        if(!zipOutFile.getParentFile().exists()){
            zipOutFile.getParentFile().mkdirs();
        }
        /**为zip文件创建目录*****/
        ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOut));
        if(!file.isDirectory())zipOutputStream.close();
        File[] subFiles = file.listFiles();
        for (File subFile : subFiles) {
            buildZipDir(zipOutputStream,subFile,null);
        }
        zipOutputStream.close();
    }
    void buildZipDir(ZipOutputStream zipOut,File file,String baseDir) throws IOException {
        if(file.isFile()){
            String zipEntryName = baseDir == null ? file.getName() : baseDir+File.separator+file.getName();
            zipOut.putNextEntry(new ZipEntry(zipEntryName));
            byte[] buffer = new byte[BUFFER_SIZE];
            try(InputStream inputStream = new FileInputStream(file)){
                int len = -1;
                while((len = inputStream.read(buffer)) != -1){
                    zipOut.write(buffer,0,len);
                }
                zipOut.flush();
                zipOut.closeEntry();
            }
        }
        else{//文件是dir,继续递归找文件
            File[] subFiles = file.listFiles();
            if(subFiles.length ==0){//处理空文件夹
                String zipName = baseDir == null ? file.getName() :baseDir + File.separator+ file.getName() ;
                zipOut.putNextEntry(new ZipEntry(zipName));
                zipOut.closeEntry();
            }else{
                for (File subFile : subFiles) {
                    String subBaseDir =baseDir == null ? file.getName() :baseDir + File.separator+ file.getName() ;
                    buildZipDir(zipOut,subFile,subBaseDir);
                }
            }
        }
    }
    public boolean isNull(String str){
        return str == null || str.equals("");
    }

测试:

    @Test
    public void testZip() throws IOException {
     String dir = "D:\\test-zip";
     //dir : 要压缩的目录
     //D:\\yy\\    指定压缩文件的位置
     //path-test.zip 指定压缩文件的名字
     zip(dir,"D:\\yy\\","path-test.zip");
    }

文件解压:ZipInputStream

ZipInputStream读取压缩文件,配合ZipFile使用;通过上面的例子,我们知道压缩包里的是一个个ZipEntry对象,在解压时,可以遍历压缩包获取到ZipEntry对象。每一个ZipEntry对象都是一个文件,使用ZipFile可以获取到每一个ZipEntry对象的文件流;获取到文件流就可以将压缩包的文件读出来了。

    public void unZip(String zipPath,String unzipPath) throws IOException {
        File file = new File(zipPath);
        ZipFile zipFile = new ZipFile(file);//zip文件
        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));
        if(isNull(unzipPath))unzipPath = zipPath.replace(".zip","");
        ZipEntry nextEntry = null;
        while( (nextEntry = zipInputStream.getNextEntry()) != null){
            String name = nextEntry.getName();
            String fileOutPath = unzipPath + File.separator + name;
            File fileOut = new File(fileOutPath);
            if(!fileOut.getParentFile().exists()){
                fileOut.getParentFile().mkdirs();
            }
            if(!fileOut.exists()){
                fileOut.createNewFile();
            }
            OutputStream  output = new FileOutputStream(fileOutPath);
            InputStream inputStream = zipFile.getInputStream(nextEntry);//通过ZipFile获取到ZipEntry的文件流
            int read = -1;
            byte[] buffer = new byte[BUFFER_SIZE];
            while((read = inputStream.read(buffer) ) != -1){
                output.write(buffer,0, read);
            }
            output.flush();
            output.close();
            inputStream.close();
        }
        zipInputStream.close();
        zipFile.close();
    }

测试:

   public void testUnzip() throws IOException {
        String zip = "D:\\yy\\path-test.zip";
        unZip(zip,null);
    }

总结

到此这篇关于Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream的文章就介绍到这了,更多相关Java zip文件压缩解压内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis plus关闭驼峰命名的四种方法(防止出现查询为Null)

    Mybatis plus关闭驼峰命名的四种方法(防止出现查询为Null)

    这篇文章主要介绍了Mybatis plus关闭驼峰命名的四种方法(防止出现查询为Null),数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式,需要的朋友可以参考下
    2022-01-01
  • 详解Java中Hibernate的基本原理

    详解Java中Hibernate的基本原理

    持久化是将程序数据在持久状态和瞬时状态间转换的机制。JDBC就是一种持久化机制。文件IO也是一种持久化机制。下面通过本文给大家介绍Java中Hibernate的基本原理,需要的朋友参考下吧
    2017-09-09
  • Spring延迟Bean初始化的实现示例

    Spring延迟Bean初始化的实现示例

    延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean,本文主要介绍了Spring延迟Bean初始化的实现示例,感兴趣的可以了解一下
    2024-06-06
  • Mybatis-plus使用TableNameHandler分表详解(附完整示例源码)

    Mybatis-plus使用TableNameHandler分表详解(附完整示例源码)

    这篇文章主要介绍了Mybatis-plus使用TableNameHandler分表详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 这一次搞懂Spring代理创建及AOP链式调用过程操作

    这一次搞懂Spring代理创建及AOP链式调用过程操作

    这篇文章主要介绍了这一次搞懂Spring代理创建及AOP链式调用过程操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • IDEA生成servlet程序的实现步骤

    IDEA生成servlet程序的实现步骤

    这篇文章主要介绍了IDEA生成servlet程序的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • spring依赖注入深入理解

    spring依赖注入深入理解

    这篇文章主要介绍了spring依赖注入深入理解,列举了最常见的注入方式,有感兴趣的同学可以研究下
    2021-03-03
  • 详细分析JAVA 线程池

    详细分析JAVA 线程池

    这篇文章主要介绍了JAVA 线程池的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    YYYY-MM-dd可能会导致跨年周的日期被归属到错误的年份, yyyy-MM-dd总是表示实际的日历年份,无论日期所在的周是否跨年,本文就来介绍一下两者的区别,感兴趣的可以了解一下
    2024-01-01
  • 带你了解Java中的异常处理(上)

    带你了解Java中的异常处理(上)

    这篇文章主要介绍了Java异常处理的相关资料,帮助大家更好的理解和学习java,感兴趣的朋友可以了解下
    2020-08-08

最新评论