输入流(读取):

ZipInputStream是一种FileInputStream流,它可以直接读取Zip压缩包的内容:

┌───────────────────┐
│    InputStream    │
└───────────────────┘▲│
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘▲│
┌───────────────────┐
│InflaterInputStream│
└───────────────────┘▲│
┌───────────────────┐
│  ZipInputStream   │
└───────────────────┘▲│
┌───────────────────┐
│  JarInputStream   │
└───────────────────┘

另一个JarInputstream是从ZipInputStream派生出来的,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。因为本质上jar包就是zip包,只是额外增加了一些固定的描述文件。

根据上述继承关系,最终还是回到了Inputstream这个抽象类中。而Java的IO标准库使用Decorator装饰器模式为Inputstream和OutputStream增加功能:

可以把一个Inputstream和任意一个FilterInputStream组合。

可以把一个OutputStream和任意一个FilterOutputStream组合。

通过装饰器模式也就可以使用ZipInputStream来操作ZIP文件了。

ZipInputstream的基本用法是:

创建一个ZipInputstream对象,传入一个FileInputstream作为数据源,然后调用getNextEntry()方法,直到返回值为null,表示zip流结束。

一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1:


import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class Demo02 {public static void main(String[] args) {try (ZipInputStream zip = new ZipInputStream(new FileInputStream("d:\\IOTest\\1-201023201325.zip"),Charset.forName("gbk"))) {ZipEntry entry = null;// 获取压缩文件中的每个子文件while ((entry = zip.getNextEntry()) != null) {System.out.println(entry.getName());}} catch (IOException e) {e.printStackTrace();}}
}

输出流(写入):

也称为压缩流,它用于以zip格式写入文件,也就是把文件打包成压缩文件,常用于附件下载,文件压缩存储。

┌───────────────────┐
│    OutputStream   │
└───────────────────┘▲│
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘▲│
┌────────────────────┐
│DeflaterOutputStream│
└────────────────────┘▲│
┌───────────────────┐
│  ZipInputStream   │
└───────────────────┘▲│
┌───────────────────┐
│  JarOutputStream  │
└───────────────────┘

压缩流常用的两个方法为:

1.

// 开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。
// 这里的ZipEntry就是一个条目// 条目类:ZipEntry(表示 ZIP 文件条目)
public void putNextEntry(ZipEntry e) throws IOException {}

2.

// 关闭当前 ZIP 条目并定位流以写入下一个条目public void closeEntry() throws IOException {}

ZipOutputStream可以把多份数据写入zip包

先创建一个ZipOutputStream对象,从中包装一个FileOutputStream流,然后每写入一个文件(条目类),先调用putNextEntry(),然后write()写入byte[]数据,写入完毕后调用closeEntry()方法结束这个文件的打包。

具体实现代码如下:


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;/*** 将指定文件写入zip文件* @author wyh**/
public class Demo02 {public static void main(String[] args) {// 原始目录File rootDir = new File("d:\\IOTest\\tuji");// 将原始目录中的文件,“写入”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();}}
}

ZIP文件的读取和写入相关推荐

  1. python对文件的读操作有哪些方法-Python中文件的读取和写入操作

    从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...

  2. python对文件的读操作方法有哪些-Python中文件的读取和写入操作

    从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...

  3. c# gerber文件读取_懒猪编程实例六:Visual C# 实现外部文件的读取和写入

    在Visual C#的环境下,用户在打开外部文件时,有时需要读取外部文件信息中的内容,有时也需要将特定的信息内容写入到外部文件当中,那么如何来实现这些功能呢?下面我们来看一下外部文件的读取和写入方法的 ...

  4. C语言中文件的读取和写入

    C语言中文件的读取和写入 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2.电脑处理文本型和二进制型的不同 (因为电脑只认识二进制格式) 在C语言中写文件 //获取文件指针 FIL ...

  5. python3中的zip_Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    ''''' Created on Dec 24, 2012 将文件归档到zip文件,并从zip文件中读取数据 @author: liury_lab ''' # 压缩成zip文件 from zipfil ...

  6. 使用Python对Dicom文件进行读取与写入的实现(pydicom 和 SimpleITK)

    这篇文章主要介绍了使用Python对Dicom文件进行读取与写入的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 使用Pyd ...

  7. Python创建txt文件并读取与写入

    Python创建txt文件并读取与写入 [PyCharm 软件内操作] 在PyCharm中创建工作目录(D:\python\test1\) 一.创建一个txt文档 # -*- coding: utf- ...

  8. C#实现excel文件的读取、写入以及异常处理,附源码程序

    C#实现excel文件的读取与写入,附源码程序 说明 关键代码段 源程序下载地址 注意事项及异常解决 说明 通过OleDB方式,对execl文件进行读取.写入操作. 注:网上很多类似的代码,但是代码中 ...

  9. 算法-(java)-从文件中读取、写入数据

    1.m的n次幂表示 在算法题中经常遇到10的n次幂,java中计算中,有一个函数,返回double类型,math.pow(m,n),m为基数,n为幂次方.这样打印出结果,会打印出带e的数字,如果想要实 ...

最新文章

  1. 【java】兴唐第二十节课(Collection 和 ArrayList)
  2. 2021年2月程序员工资统计,又拖后腿了……
  3. SQL基础--过滤和排序
  4. AutoCompleteTextView的简单用法
  5. 科普|数据治理如何在 Martech 中发挥效能?
  6. 2引擎帮助文档_Simcenter Amesim 16液压部分帮助文档中英文对照(2)
  7. 【python】sys.stdout输出不换行
  8. nuxt页面跳转_Nuxt.js错误页面跳转可能出现的问题
  9. 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
  10. ffmpeg系列-视频旋转角度实现
  11. AVAssetWriter写h264数据
  12. 学习java.awt
  13. [转载]教师节献礼-关于大学的一点思考
  14. python---酒鬼漫步
  15. 【Udacity】数据的差异性:值域、IQR、方差和标准差
  16. 创宇区块链|Inverse Finance 安全事件分析
  17. Bugzilla的使用
  18. 解决python爬虫出现的521问题
  19. 深度学习与自然语言处理实验——中文信息熵的计算
  20. R语言时间序列基础库zoo

热门文章

  1. 蓝牙 - 关于5.0版本的一些解释
  2. 一、Sprig MVC简介
  3. Autoware显示用户界面细节
  4. 3D.处女座的训练(C++)
  5. C++实现选择性排序
  6. poi设置Word页边距
  7. AutoCADElectrical制图软件对电脑配置的要求
  8. SQL:开窗排序,在order by 后加判断条件的作用是什么?
  9. 使用python写一个选股策略
  10. Oracle OPM 成本