如果遇到,向现有的压缩包里增加文件的需求可以参照如下的方式:

思路:1、先将压缩包解压

2、删除旧的压缩包

3、将解压后的文件和希望添加的文件一起重新生成一个压缩包

4、将第一步中解压后的文件删除。

一、依赖

  <!-- 文件压缩,解压 -->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.7</version>
</dependency>

二、工具类

package com.test;

import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipException; import org.apache.tools.zip.*; public class ZipUtil { private static int BUFFERSIZE = 1024; /**
* 压缩
*
* @param paths
* @param fileName
*/
public static void zip(List<String> paths, String fileName) {
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(new FileOutputStream(fileName));
for (String filePath : paths) {
// 递归压缩文件
File file = new File(filePath);
String relativePath = file.getName();
if (file.isDirectory()) {
relativePath += File.separator;
}
zipFile(file, relativePath, zos);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (zos != null) {
zos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void zipFile(File file, String relativePath, ZipOutputStream zos) {
InputStream is = null;
try {
if (!file.isDirectory()) {
ZipEntry zp = new ZipEntry(relativePath);
zos.putNextEntry(zp);
is = new FileInputStream(file);
byte[] buffer = new byte[BUFFERSIZE];
int length = 0;
while ((length = is.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.setEncoding("gbk");//解决文件名中文乱码
zos.flush();
zos.closeEntry();
} else {
String tempPath = null;
for (File f : file.listFiles()) {
tempPath = relativePath + f.getName();
if (f.isDirectory()) {
tempPath += File.separator;
}
zipFile(f, tempPath, zos);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 解压缩
*
* @param fileName
* @param path
*/
public static List<String> unzip(String fileName, String path) {
FileOutputStream fos = null;
InputStream is = null;
List<String> filePaths = new ArrayList<String>();
try {
ZipFile zf = new ZipFile(new File(fileName), "GBK");
Enumeration<?> en = zf.getEntries();
while (en.hasMoreElements()) {
ZipEntry zn = (ZipEntry) en.nextElement();
if (!zn.isDirectory()) {
is = zf.getInputStream(zn);
File f = new File(path + zn.getName());
File file = f.getParentFile();
file.mkdirs();
fos = new FileOutputStream(path + zn.getName());
int len = 0;
byte bufer[] = new byte[BUFFERSIZE];
while (-1 != (len = is.read(bufer))) {
fos.write(bufer, 0, len);
}
fos.close();
filePaths.add(path + zn.getName());
}
}
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != is) {
is.close();
}
if (null != fos) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return filePaths;
}
}

三、调用方法

package com.test;

import java.io.File;
import java.util.List; public class ZipUtilTest {
public static void main(String[] args) {
//解压
List<String> files = ZipUtil.unzip("D:/test.zip", "D:/");
//增加想要向压缩包里增加的文件
files.add("D:/1.txt");
//删除以前的压缩包
File oldZipfile = new File("D:/test.zip");
if(oldZipfile.exists()){
oldZipfile.delete();
}
//生成新的压缩包
ZipUtil.zip(files,"D:/test.zip"); //保留注D:/1.txt,这里不从List里删除,最后一步就会把文件删除
files.remove(files.size()-1); //删除上面解压出来的文件
for(String f : files){
File file = new File(f);
if(file.exists()){
file.delete();
}
}
}
}

完结赶紧试试吧!

java向一个压缩包里增加文件的更多相关文章

  1. Java判断一个类里是否存在某个属性

    Java判断一个类里是否存在某个属性 测试pojo类,比方我有个User类 @Getter @Setter public class User { private Long id; private S ...

  2. 如何 Laravel 中验证 zip 压缩包里的文件?

    在 Laravel 程序中上传文件时,请求验证可以很好验证上传的文件.你可以要求上传文件必须为 图片 , 也可以限制文件字节 大小 , 也可以根据 mime types 或者 文件扩展名 过滤文件. ...

  3. JAVA HTML 以压缩包下载多文件

    Html:  利用form表单来发送下载请求 <form id ="submitForm" method="post"> </form> ...

  4. 用Java写一个PDF,Word文件转换工具

    前言 前段时间一直使用到word文档转pdf或者pdf转word,寻思着用Java应该是可以实现的,于是花了点时间写了个文件转换工具 源码weloe/FileConversion (github.co ...

  5. JAVA 解压压缩包中指定文件或实现压缩文件的预览及下载单个或多个指定的文件

    业务逻辑中还要判读用户是否有此文件的防问权限 2017-04-20 新增文件与文件夹图标显示及过滤高亮显示功能: 2017-05-20 新增搜索向前及向后.及更新下载功能.更新文件路径显示: 测试地址 ...

  6. JAVA 从一个List里删除包含另一个List的数据

    /** * 从listA里删除listB里有的数据 * @param listA * @param listB * @return */ public static List<String> ...

  7. Java 操作jar包工具类以及如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  8. Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  9. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  10. java byte【】数组与文件读写(增加新功能)

    今天在测试直接写的文章: java byte[]数组与文件读写 时,想调用FileHelper类对字节数组以追加的方式写文件,结果无论怎样竟然数据录入不全,重新看了下文件的追加模式,提供了两种方式: ...

随机推荐

  1. 初探webpack之单应用多端构建

    初探webpack之单应用多端构建 在现代化前端开发中,我们可以借助构建工具来简化很多工作,单应用多端构建就是其中应用比较广泛的方案,webpack中提供了loader与plugin来给予开发者非常大 ...

  2. 如何将IPv4升级到IPv6?看完你就明白了

    引言: 随着互联网的快速发展,IPv4(Internet Protocol version 4)已经无法满足日益增长的设备和用户数量的需求. IPv6(Internet Protocol versio ...

  3. SpringBoot Seata 死锁问题排查

    现象描述:Spring Boot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出 但是,奇怪的是,本地可以正常启动 好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无法启动的问 ...

  4. Windows风格的个人网盘,支持文档在线编辑

    这是一个Windows页面风格的个人网盘,支持普通文本.文档.表格.xmind等在线编辑,支持Windows的小组件,例如计算器.WhiteBoard.python 等,其他更多功能待你来发现,也待你 ...

  5. 如何基于 k8s做私有化部署

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 随着国内数字化转型的加速和国产化进程推动,软件系统的私有化部署已经成为非常热门的话题,因为私有化部署赋予了企业更大的灵活和 ...

  6. Python实现模块热加载

    为什么需要热加载 在某些情况,你可能不希望关闭Python进程并重新打开,或者你无法重新启动Python,这时候就需要实现实时修改代码实时生效,而不用重新启动Python 在我的需求下,这个功能非常重 ...

  7. ezbypass-cat【目录穿透】

    ezbypass-cat[目录穿透][难度:4] 题目界面 尝试SQL注入无果,看题解发现是目录穿透,需要抓包才能得到flag. 解题步骤 随便输入用户名和密码抓包 更改请求方式(POST→GET), ...

  8. GPT-4多模态大型语言模型发布

    GPT-4 模型是OpenAI开发的第四代大型语言模型(LLM),它将是一个多模态模型,会提供完全不同的可能性-例如文字转图像.音乐甚至视频.GPT 全称为 Generative Pre-traine ...

  9. Springboot3核心特性

    一.简介 1. 前置知识 Java17 Spring.SpringMVC.MyBatis Maven.IDEA 2. 环境要求 环境&工具 版本(or later) SpringBoot 3. ...

  10. libGDX游戏开发之弹窗(五)

    libGDX游戏开发之弹窗(五) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和google找 ...