[Java] 遍历zip内的数据,逐项复制流来生成新的zip文件的范例(可用于替换zip内的文件)

作者: zyl910

一、缘由

有些时候需要替换zip内的文件。
网上的办法大多是——先解压,然后对解压目录替换文件,最后再重新压缩。该办法需要比较繁琐,且需要一个临时目录。
于是想找无需解压的方案。
后来找到利用 ZipInputStream、ZipOutputStream 实现该功能的办法。

二、源码

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipCopyTest {
    public static void main(String[] args) {
        String srcPath = "target/classes/static/test.docx";
        String outPath = "E:\\test\\export\\test_copy.docx";
        try(FileInputStream is = new FileInputStream(srcPath)) {
            try(FileOutputStream os = new FileOutputStream(outPath)) {
                copyZipStream(os, is);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("ZipCopyTest done.");
    }

    private static void copyZipStream(OutputStream os, InputStream is) throws IOException {
        try(ZipInputStream zis = new ZipInputStream(is)) {
            try(ZipOutputStream zos = new ZipOutputStream(os)) {
                ZipEntry se;
                while ((se = zis.getNextEntry()) != null) {
                    if (null==se) continue;
                    String line = String.format("ZipEntry(%s, isDirectory=%d, size=%d, compressedSize=%d, time=%d, crc=%d, method=%d, comment=%s)",
                            se.getName(), (se.isDirectory())?1:0, se.getSize(), se.getCompressedSize(), se.getTime(), se.getCrc(), se.getMethod(), se.getComment());
                    System.out.println(line);
                    ZipEntry de = new ZipEntry(se);
                    zos.putNextEntry(de);
                    copyStream(zos, zis);
                    zos.closeEntry();
                }
            }
        }
    }

    private static void copyStream(OutputStream os, InputStream is) throws IOException {
        copyStream(os, is, 0);
    }

    private static void copyStream(OutputStream os, InputStream is, int bufsize) throws IOException {
        if (bufsize

现在已经实现zip内项目的逐项复制了。只要稍微改造一下,便能实现”替换zip内的文件”的功能了。
具体办法是在循环内根据 ZipEntry.getName() 判断当前是哪一个文件,随后不是简单的调用 copyStream,而是改为根据自己需要对流数据进行处理。

参考文献

Original: https://www.cnblogs.com/zyl910/p/java_zip_zipcopytest.html
Author: zyl910
Title: [Java] 遍历zip内的数据,逐项复制流来生成新的zip文件的范例(可用于替换zip内的文件)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536651/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • spring data jpa简单使用—-逐渐完善

    第一步: 导入依赖 org.springframework.boot spring-boot-starter-data-jpa第二步:  配置文件   spring: #数据库 d…

    Java 2023年6月5日
    099
  • Vue脚手架配置代理

    方法一:在vue.config.js中添加如下配置 devServer: { proxy: "远程服务器地址及端口号", } 说明: 优点:配置简单,请求资源时…

    Java 2023年6月13日
    077
  • 设计模式之策略模式

    在一个收银系统中,如果普通用户、中级会员、高级会员分别对应着不同的优惠策略,常规编程就要使用一系列的判断语句,判断用户类型,这种情况下就可以使用策略模式。 一、概念理解 策略模式的…

    Java 2023年6月8日
    0105
  • 从new File(“”)到jdk源码

    概述 今天在项目中看到下面两行代码,看注释说是获取当前工作路径,之前也没有用过这种用法,比较好奇还能这样用,所以研究了一下源码。 //获&#x53D6…

    Java 2023年6月14日
    079
  • TypeScript(7)泛型

    泛型 指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。 引入 下面创建一个函数, 实现功能: 根据指定的数量 count 和数据 val…

    Java 2023年6月9日
    093
  • 快捷键

    常用快捷键 文档操作通用快捷键• ctrl + c 复制• ctrl + v 粘贴• ctrl + x 剪切• ctrl + s 保存• ctrl + z 撤销• ctrl + y…

    Java 2023年6月7日
    076
  • 高司令 老骥伏枥,志在千里的 Java 之父

    1994年底,互联网的蓬勃发展给了 Oak 机会:James Gosling 参加了在硅谷召开的”技术、教育和设计大会”。他报着试一试的心情向与会者演示了 …

    Java 2023年5月29日
    085
  • Java函数的学习

    函数的定义 – 定义的位置:&#x5B9…

    Java 2023年6月5日
    070
  • linux安装docker以及可视化管理界面

    一、docker 安装 1.0、准备 确保yum是最新的 yum update 查看是否已安装docker列表 yum list installed | grep docker 1…

    Java 2023年6月5日
    080
  • 多线程(线程组【ThreadGroup】)

    线程组: 把多个线程组合到一起。* 它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。 生产者和消费者之等待唤醒机制的代码优化 线程实现类—设置和获取…

    Java 2023年6月5日
    081
  • fastHttp服务端处理请求的过程

    主要代码 设置监听地址 server.go func (s *Server) ListenAndServe(addr string) error { ln, err := net….

    Java 2023年5月30日
    0114
  • 如何用火焰图进行 Java 性能分析

    Linux下用火焰图进行性能分析(Ubuntu18 操作系统中演示) 软件的性能分析,往往需要查看 CPU 耗时, 了解瓶颈在哪里,而火焰图(flame graph) 是性能分析的…

    Java 2023年5月29日
    062
  • Redis八:Windows环境下的Redis集群搭建-官方Redis Cluster 方案(服务端路由查询)

    一、准备工作 本次Redis 集群搭建使用官方提供的Redis Cluster的管理工具:redis-trib.rb; 一共需要4个部件: Redis Ruby语言运行环境 Red…

    Java 2023年6月8日
    093
  • Idea的Debug

    来自CSDN:https://blog.csdn.net/yxl_1207/article/details/80973622 Original: https://www.cnblo…

    Java 2023年6月8日
    065
  • c#类属性反射成字典或其他集合

    [Test] public void Test() { var result = new Dictionary<string, string>(); var credi…

    Java 2023年5月30日
    082
  • 高可用架构(上)

    1. 背景 在学习完各种高性能发实现方案后,就需要对三大复杂度一直的高可用进行开刀了,在高可用方面主要有哪些东西是我们需要考虑的呢?接下来将从三个方面逐一分析。 2. 理论 在设计…

    Java 2023年6月15日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球