热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

基于Java向zip压缩包追加文件

这篇文章主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

有个需求,从某个接口下载的一个zip压缩包,往里面添加一个说明文件。搜索了一下,没有找到往zip直接添加文件的方法,最终解决方法是先解压、再压缩。

具体过程如下:

1、一个zip文件的压缩和解压工具类

pom.xml加入依赖包,如下:

  
   org.apache.ant
   ant
   1.10.7
  

工具类代码:

package com.example.demo;

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 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 unzip(String fileName, String path) {
  FileOutputStream fos = null;
  InputStream is = null;
  List filePaths = new ArrayList();
  try {
   ZipFile zf = new ZipFile(new File(fileName));
   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;
 }
 }

2、测试

有如下目录结构:

D:\测试\文档.zip

D:\测试\说明.pdf

把“说明.pdf”添加到“文档.zip”里面,生成一个新压缩包“文档(新).zip”。

package com.example.demo;

import java.io.File;
import java.util.List;

public class ZipUtilTest {
 public static void main(String[] args) {
  //解压
  List files = ZipUtil.unzip("D:/测试/文档.zip", "D:/测试/");
  //集合添加文件
  files.add("D:/测试/说明.pdf");
  //压缩
  ZipUtil.zip(files,"D:/测试/文档(新).zip");
  //保留说明.pdf
  files.remove(files.size()-1);
  //删除上面解压出来的文件
  for(String f : files){
   File file = new File(f);
   if(file.exists()){
    file.delete();
   }
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
外星人源码商城
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有