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. 《DSP using MATLAB》Problem 5.28

    昨晚手机在看X信的时候突然黑屏,开机重启都没反应,今天维修师傅说使用时间太长了,还是买个新的吧,心疼银子啊! 这里只放前两个小题的图. 代码: 1. %% ++++++++++++++++++++++ ...

  2. CH4401 蒲公英

    题意 4401 蒲公英 0x40「数据结构进阶」例题 描述 题目PDF 样例输入 6 3 1 2 3 2 1 2 1 5 3 6 1 5 样例输出 1 2 1 来源 石家庄二中Violet 6杯省选模 ...

  3. centos7配置openldap服务器

    参考链接 https://www.cnblogs.com/bigbrotherer/p/7251372.html 上面这篇参考文件在最后登录是有问题的 vi /etc/openldap/sldap.c ...

  4. 简单 babel plugin 开发-使用lerna 工具

    babel在现在的web 应用开发上具有很重要的作用,帮助我们做了好多事情,同时又有 比较多的babel plugin 可以解决我们实际开发上的问题. 以下只是学习下如果编写一个简单的babel pl ...

  5. Go语言实战 (William,Kennedy 等著)

    第1章 关于Go语言的介绍 (已看) 1.1 用Go解决现代编程难题 1.1.1 开发速度 1.1.2 并发 1. goroutine 2. 通道 1.1.3 Go语言的类型系统 1. 类型简单 2. ...

  6. sql里 where和order by一起使用是怎样的顺序

    where 列2 = ‘条件1’ 这个先执行过滤后的数据 再order by ‘条件2’最后取第一条数据也就是先where 再order by 再limit

  7. 使用cmake编译luabind

    编写了一下cmakelists.txt文件 根目录 cmake_minimum_required(VERSION 2.8)project (Test) add_definitions( "/ ...

  8. [转]一个故事讲清楚NIO

    假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) 职员打印票据,并将钱和票据返回给 ...

  9. 打造mac上最好用的Terminal

    出处:https://blog.csdn.net/kebing1011/article/details/46934533?utm_source=blogxgwz0

  10. django ajax报错解决:You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set.

    Django版本号:1.11.15 django中ajax请求报错:You called this URL via POST, but the URL doesn't end in a slash a ...