1.ZipInputStream是一种FilterInputStream

  • 可以直接读取zip的内容
  • InputStream->FilterInputStream->InflateInputStream->ZipInputStream->JarInputStream
  • JarInputStream使用ZipInputStream派生出来的,可以直接读取jar文件的MANIFEST.MF文件

ZipInputStream的基本用法:

try(ZipInputStream zip = new ZipInputStream()...){
ZipEntry entry = null;
while((entry=zip.getNextEntry())!=null){//getNextEntry返回null,zip流结束
String name = entry.getName();//每一个entry都表示一个压缩文件或者目录
if(!entry.isDirectory()){
int n;
while((n=zip.read()) != -1){...}//如果entry是压缩文件,就不断读取,直到返回-1
}
}
}

问题:为什么read()传入的zip,不是entry?zip流是按照单个文件读取的。Entry代表当前文件或目录,zip.read()读取返回-1,当前entry结束,开始下一个entry。

2.ZipOutputStream是一种FilterOutputStream

  • 可以直接写入Zip的内容
try(ZipOutputStream zip = new ZipOutputStream(...)){
File[] files = ...
for(File file:files){
zip.putNextEntry(new ZipEntry(file.getName()));//未考虑文件目录的层次结构;如果考虑层次结构,传入的name需要使用相对路径
zip.write(getFilterDataAsBytes(file));//写入byte数据
zip.closeEntry();//结束这个文件的打包
}
}
## 3.示例
```#java
public class Main { public static void main(String[] args) throws IOException {
try(//需要调用ZipInputStream的getNextEntry(),因此没有将zip转型为InputStream
ZipInputStream zip = new ZipInputStream(
new BufferedInputStream(
new FileInputStream("./src/main/java/com/testList/agent.jar")))){
ZipEntry entry = null;
while((entry=zip.getNextEntry())!=null){
if(entry.isDirectory()){
System.out.println("D "+entry.getName()+"\t"+entry.getSize()); }else{
System.out.println("F "+entry.getName()+"\t"+entry.getSize());//打印entry的大小
printFileContent(zip);
}
}
}
}
static void printFileContent(ZipInputStream zip) throws IOException{
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int n = 0;
while((n=zip.read(buffer))!=-1){
output.write(buffer,0,n);
}
byte[] data = output.toByteArray();
System.out.println(" size:"+data.length);
}
}

4.总结:

  • ZipInputStream可以读取Zip格式的流
  • ZipOutputStream可以把数据写入Zip
  • ZipInputStream/ZipOutputStream都是FilterInputStream/FilterOutputStream
  • 配合FileInputStream和File OutputStream就可以读写Zip文件

廖雪峰Java6 IO编程-2input和output-5操作zip的更多相关文章

  1. 廖雪峰Java6 IO编程-2input和output-4Filter模式

    1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...

  2. 廖雪峰Java6 IO编程-2input和output-7序列化

    1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializ ...

  3. 廖雪峰Java6 IO编程-2input和output-6classpath资源

    1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linu ...

  4. 廖雪峰Java6 IO编程-3Reader和Writer-2Writer

    1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):v ...

  5. 廖雪峰Java6 IO编程-3Reader和Writer-1Reader

    1.java.io.Reader和java.io.InputStream的区别 InputStream Reader 字节流,以byte为单位 字符流,以char为单位 读取字节(-1,0-255): ...

  6. 廖雪峰Java13网络编程-1Socket编程-2TCP编程

    1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...

  7. 廖雪峰Java13网络编程-3其他-1HTTP编程

    1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...

  8. 廖雪峰Java13网络编程-1Socket编程-5UDP编程

    1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...

  9. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

随机推荐

  1. hdu4565 So Easy! 矩阵快速幂

    A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example ...

  2. 深入学习Motan系列(一)——入门及知识zookeeper储备

    背景以及说明: 最近逮到个RPC框架,打算深入学习,框架千千万,只有懂得内部原理,才能应对复杂的业务,进行自定义化系统. 这个系列的Motan文章也是自己慢慢摸索的轨迹,将这个过程记录下来,一是提升自 ...

  3. numpy数据集练习 ----------sklearn类

    # 1. 安装scipy,numpy,sklearn包 import numpy from sklearn.datasets import load_iris # 2. 从sklearn包自带的数据集 ...

  4. zabbix监控mysql最简单的方法

    该实验基于我的上一篇文章监控第一台主机的基础上 首先,因为水平有限,我选择直接关闭了防火墙和SELinux. 环境: 两台centos7,服务器端IP是192.168.200.128(以下简称主机), ...

  5. dive 方便的观察容器各层信息的工具

      dive 是一个方便的观察容器各层信息的工具,同时也集成了容器构建命令,方便我们在构建容器 镜像的同时查询镜像各层的变动信息 安装 mac 系统,可以按照自己的系统选择安装方式 wget http ...

  6. Microsoft Bot Framework 上手

    因为这前使用过MS Bot Frameowrk 做过开发, 最近心血来潮想做(挖坑)一个小的bot. 今天带领大家使用MS Bot Framework创建Hello World. 首先,我们要创建项目 ...

  7. java 打印图形

    打印菱形 package study.stage2; /** * Created by Sandy.Liu on 2017/7/27. */public class Diamond { public ...

  8. Java 8后的首个长期支持版本Java 11

    Java 11是Java8后的首个长期支持版本.按照 Oracle 公布的支持路线图,Java 11 将会获得 Oracle 提供的长期支持服务,直至2026年9月. 按照官方的说法,新的发布周期会严 ...

  9. JMeter ----与WebDriver安装与测试

    JMeter ----与WebDriver安装与测试 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 环境与参考 jvm版本: 1.8.0_65 j ...

  10. java程序控制

    一.软件生命周期 什么是软件: 软件是程序员根据需求用计算机的语言去编写一系列的指令的集合,能让计算机快速去自动执行.1.1做市场调研----->调研报告书 ======项目经理 1.2可行性分 ...