廖雪峰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以后,通 ...
随机推荐
- hdu4998 Rotate 计算几何
Noting is more interesting than rotation! Your little sister likes to rotate things. To put it easie ...
- BootStrap------之模态框1
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- C# to IL 2 IL Basics(IL基础)
This chapter and the next couple of them will focus on and elicit a simple belief of ours,that if yo ...
- openstack--7--创建一台虚拟机
回顾下前几节用到的东西 MySQL:为各个服务提供数据存储RabbitmQ:为各个服务之间提供通信提供交通枢纽Keystone:为各个服务之间通信提供认证和服务注册Glance:为虚拟机提供镜像管理N ...
- removing-guest-session-at-login-in-ubuntu-14-04
http://askubuntu.com/questions/451526/removing-guest-session-at-login-in-ubuntu-14-04
- [转]JBoss7中domain、standalone模式介绍
JBoss AS7 可实现为云做好准备的架构,并可使启动时间缩短十倍,提供更快的部署速度并降低内在的占用.JBoss Enterprise Application Platform 6 的核心是JBo ...
- MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号;一般,表名与字段名都使用反引号。
MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号:一般,表名与字段名都使用反引号.
- JS 缓存
JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串. 例: JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON. ...
- jdk源码剖析二: 对象内存布局、synchronized终极原理
很多人一提到锁,自然第一个想到了synchronized,但一直不懂源码实现,现特地追踪到C++层来剥开synchronized的面纱. 网上的很多描述大都不全,让人看了不够爽,看完本章,你将彻底了解 ...
- Window下Tomcat单机部署多应用
1. 新增tomcat相关环境变量 如上图,有两个tomcat,tomcat1和tomcat2 2.修改catalina.bat 文件 第一个tomcat不变 第二个tamcat的catalina.b ...