廖雪峰Java6 IO编程-2input和output-5操作zip
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的更多相关文章
- 廖雪峰Java6 IO编程-2input和output-4Filter模式
1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...
- 廖雪峰Java6 IO编程-2input和output-7序列化
1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializ ...
- 廖雪峰Java6 IO编程-2input和output-6classpath资源
1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linu ...
- 廖雪峰Java6 IO编程-3Reader和Writer-2Writer
1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):v ...
- 廖雪峰Java6 IO编程-3Reader和Writer-1Reader
1.java.io.Reader和java.io.InputStream的区别 InputStream Reader 字节流,以byte为单位 字符流,以char为单位 读取字节(-1,0-255): ...
- 廖雪峰Java13网络编程-1Socket编程-2TCP编程
1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...
- 廖雪峰Java13网络编程-3其他-1HTTP编程
1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...
- 廖雪峰Java13网络编程-1Socket编程-5UDP编程
1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...
- 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...
随机推荐
- 《DSP using MATLAB》Problem 5.28
昨晚手机在看X信的时候突然黑屏,开机重启都没反应,今天维修师傅说使用时间太长了,还是买个新的吧,心疼银子啊! 这里只放前两个小题的图. 代码: 1. %% ++++++++++++++++++++++ ...
- CH4401 蒲公英
题意 4401 蒲公英 0x40「数据结构进阶」例题 描述 题目PDF 样例输入 6 3 1 2 3 2 1 2 1 5 3 6 1 5 样例输出 1 2 1 来源 石家庄二中Violet 6杯省选模 ...
- centos7配置openldap服务器
参考链接 https://www.cnblogs.com/bigbrotherer/p/7251372.html 上面这篇参考文件在最后登录是有问题的 vi /etc/openldap/sldap.c ...
- 简单 babel plugin 开发-使用lerna 工具
babel在现在的web 应用开发上具有很重要的作用,帮助我们做了好多事情,同时又有 比较多的babel plugin 可以解决我们实际开发上的问题. 以下只是学习下如果编写一个简单的babel pl ...
- Go语言实战 (William,Kennedy 等著)
第1章 关于Go语言的介绍 (已看) 1.1 用Go解决现代编程难题 1.1.1 开发速度 1.1.2 并发 1. goroutine 2. 通道 1.1.3 Go语言的类型系统 1. 类型简单 2. ...
- sql里 where和order by一起使用是怎样的顺序
where 列2 = ‘条件1’ 这个先执行过滤后的数据 再order by ‘条件2’最后取第一条数据也就是先where 再order by 再limit
- 使用cmake编译luabind
编写了一下cmakelists.txt文件 根目录 cmake_minimum_required(VERSION 2.8)project (Test) add_definitions( "/ ...
- [转]一个故事讲清楚NIO
假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) 职员打印票据,并将钱和票据返回给 ...
- 打造mac上最好用的Terminal
出处:https://blog.csdn.net/kebing1011/article/details/46934533?utm_source=blogxgwz0
- 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 ...