在我们日常使用中,zip压缩文件是非常常用的,市面上也有许多压缩软件,那么我们为什么要用java去操作zip,使用压缩软件不香吗?其实试想有这样一个需求,在这个项目中,有上传功能,如果要上传多个文件,这样频繁的操作远远不如上传一个压缩包方便,上传后如果要操作这些压缩包里的文件,用IO流不就方便多了。因此就得先了解ZipInputStream类和ZipOutputStream类。

ZipInputStream:继承自FilterInputStream类,采用了装饰器模式,可以直接读取zip包中的内容, 内部封装有ZipEntry类型的属性,在读取zip文件内部子文件时,调用getNextEntry()方法时,每个ZipEntry对象就是每个子文件。

ZipOutputStream:继承自FilterOutputStream类,采用了装饰器模式,可以直接写入内容到zip包中, 内部同样封装有ZipEntry类型的属性,但是在写入Zip压缩文件时,调用putNextEntry()方法,需要把每个子文件作为ZipEntry对象传入。

读取Zip包(解压缩)

首先要创建解压缩目录targetDir,通常是与zip文件在同一个目录下,通过用zip文件的父目录与zip文件的文件名作为数据源,并调用mkdir()方法创建目录。

第二步就是解析并读取zip压缩文件,创建一个ZipInputStream,传入一个FileInputStream作为数据源,然后循环调用getNextEntry(),遍历zip文件每个子文件,每次循环获取子文件的文件名并创建该文件的输出流,调用write()方法,读取文件内容并写入输出流。代码如下:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class Demo01 {public static void main(String[] args) {// 要进行解压缩的zip文件File zipFile = new File("D:\\test\\1-201023201325.zip");// 1.创建解压缩目录// 获取zip文件的名称String zipFileName = zipFile.getName();// 根据zip文件名称,提取压缩文件目录String targetDirName = zipFileName.substring(0, zipFileName.indexOf("."));// 创建解压缩目录File targetDir = new File(zipFile.getParent() + "\\" + targetDirName);if (!targetDir.exists()) {targetDir.mkdir(); // 创建目录}// 2.解析读取zip文件try (ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile), Charset.forName("gbk"))) {// 遍历zip文件中的每个子文件ZipEntry zipEntry = null;while ((zipEntry = in.getNextEntry()) != null) {// 获取zip压缩包中的子文件名称String zipEntryFileName = zipEntry.getName();// 创建该文件的输出流String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;// 输出流定义在try()块,结束自动清空缓冲区并关闭try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFilePath))) {// 读取该子文件的字节内容byte[] buff = new byte[1024];int len = -1;while ((len = in.read(buff)) != -1) {bos.write(buff, 0, len);}}}} catch (IOException e) {e.printStackTrace();}}
}

写入zip包(压缩)

首先创建File对象rootDir引用原始目录,然后创建一个ZipOutputStream,传入一FileOutputStream作为数据源,调用listFiles()方法,获取并遍历原始目录下的子文件列表,每次循环创建一个ZipEntry,每写入一个文件前,调用putNextEntry()方法,然后将原文件的字节内容,写入zip压缩包,需要注意,每次写完文件,必须调用closeEntry()结束当前ZipEntry。代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class Demo02 {public static void main(String[] args) {// 原始目录File rootDir = new File("D:\\test\\20220529");System.out.println(rootDir.getAbsolutePath());// 将原始目录中的文件,“写入”zip压缩文件try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {// 获取并遍历原始目录下的子文件列表File[] files = rootDir.listFiles();for (File f : files) {// 创建一个ZipEntryout.putNextEntry(new ZipEntry(f.getName()));// 将原文件的字节内容,写入zip压缩包out.write(Files.readAllBytes(f.toPath()));// 结束当前ZipEntryout.closeEntry();}} catch (IOException e) {e.printStackTrace();}}}

Java中如何读取和写入zip文件相关推荐

  1. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  2. 在线程中进行读取并写入文件和wenjia

    新人求(胸)罩!!! 1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundExc ...

  3. java中如何读取文件内容,附源代码

    Java File类(文件操作类)详解在Java中,File类是java.io包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过File类来完成.File类定义了一 ...

  4. Java中如何读取文件夹下的所有文件

    问题:Java中如何读取文件夹下的所有文件 Java里面是如何读取一个文件夹下的所有文件的? 回答一 public void listFilesForFolder(final File folder) ...

  5. pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...

    前期文章链接: YOLOv3论文 https://arxiv.org/pdf/1804.02767.pdf 正文: 有许多方法可以在Python中读写CSV文件.有几种不同的方法,例如,您可以使用Py ...

  6. [转载] pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...

    参考链接: 使用Pandas在Python中读写CSV文件 前期文章链接: YOLOv3论文 https://arxiv.org/pdf/1804.02767.pdf 正文: 有许多方法可以在Pyth ...

  7. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

  8. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  9. 01-使用EasyExcel读取和写入Excel文件

    一.EasyExcel介绍 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内 ...

最新文章

  1. 虚拟机下Linux安装图解之二:虚拟机的创建
  2. html记仇表情包源码,写小本本记仇表情包
  3. ajax-》post
  4. 一文读懂Netty的核心构成块
  5. (笔记)Mysql命令show databases:显示所有数据库
  6. 如何给你的Android 安装文件(APK)瘦身
  7. 【IDEA】项目集成svn
  8. VC2005 MFC静态文本框背景色设置
  9. INVEST模型生境质量评价之威胁源数据处理
  10. 李广难封--有感于团队建设
  11. Shenyu网关本地打docker镜像包
  12. C++练习 - 字符转换
  13. html radio vue,Vue.js选中动态绑定的radio的指定项_心病_前端开发者
  14. 上海车展:比亚迪宋L概念车全球首发,这是要硬扛特斯拉?
  15. 使用Ionic.Zip压缩、分卷压缩、解压文件
  16. python数据分析岗位做什么_给力!数据分析岗位内部人的建议,可以少走很多弯路...
  17. 产品三维模型在线预览
  18. Flink 的 算子链 和 资源组
  19. 高级工程师面试 - PHP
  20. hc05与单片机连接图_基于proteus的51单片机开发实例37-DAC0832

热门文章

  1. 365天英语口语学习_09,肉类
  2. 微积分——一元微积分学
  3. 几个常用的win cmd命令
  4. 1 安培3.2V磷酸铁锂电池充电方案
  5. 【2012校园招聘】中兴
  6. 几款主流分叉币现状分析
  7. 期待已久的—YOLO V3
  8. CRC校验verilog实现原理和反馈移位寄存器的关系
  9. 蓝桥杯2014省赛——李白打酒(Java)
  10. Kafka原理篇:图解kafka架构原理