ZIP文件的读取和写入
输入流(读取):
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文件的读取和写入相关推荐
- python对文件的读操作有哪些方法-Python中文件的读取和写入操作
从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...
- python对文件的读操作方法有哪些-Python中文件的读取和写入操作
从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...
- c# gerber文件读取_懒猪编程实例六:Visual C# 实现外部文件的读取和写入
在Visual C#的环境下,用户在打开外部文件时,有时需要读取外部文件信息中的内容,有时也需要将特定的信息内容写入到外部文件当中,那么如何来实现这些功能呢?下面我们来看一下外部文件的读取和写入方法的 ...
- C语言中文件的读取和写入
C语言中文件的读取和写入 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2.电脑处理文本型和二进制型的不同 (因为电脑只认识二进制格式) 在C语言中写文件 //获取文件指针 FIL ...
- python3中的zip_Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
''''' Created on Dec 24, 2012 将文件归档到zip文件,并从zip文件中读取数据 @author: liury_lab ''' # 压缩成zip文件 from zipfil ...
- 使用Python对Dicom文件进行读取与写入的实现(pydicom 和 SimpleITK)
这篇文章主要介绍了使用Python对Dicom文件进行读取与写入的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 使用Pyd ...
- Python创建txt文件并读取与写入
Python创建txt文件并读取与写入 [PyCharm 软件内操作] 在PyCharm中创建工作目录(D:\python\test1\) 一.创建一个txt文档 # -*- coding: utf- ...
- C#实现excel文件的读取、写入以及异常处理,附源码程序
C#实现excel文件的读取与写入,附源码程序 说明 关键代码段 源程序下载地址 注意事项及异常解决 说明 通过OleDB方式,对execl文件进行读取.写入操作. 注:网上很多类似的代码,但是代码中 ...
- 算法-(java)-从文件中读取、写入数据
1.m的n次幂表示 在算法题中经常遇到10的n次幂,java中计算中,有一个函数,返回double类型,math.pow(m,n),m为基数,n为幂次方.这样打印出结果,会打印出带e的数字,如果想要实 ...
最新文章
- 【java】兴唐第二十节课(Collection 和 ArrayList)
- 2021年2月程序员工资统计,又拖后腿了……
- SQL基础--过滤和排序
- AutoCompleteTextView的简单用法
- 科普|数据治理如何在 Martech 中发挥效能?
- 2引擎帮助文档_Simcenter Amesim 16液压部分帮助文档中英文对照(2)
- 【python】sys.stdout输出不换行
- nuxt页面跳转_Nuxt.js错误页面跳转可能出现的问题
- 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
- ffmpeg系列-视频旋转角度实现
- AVAssetWriter写h264数据
- 学习java.awt
- [转载]教师节献礼-关于大学的一点思考
- python---酒鬼漫步
- 【Udacity】数据的差异性:值域、IQR、方差和标准差
- 创宇区块链|Inverse Finance 安全事件分析
- Bugzilla的使用
- 解决python爬虫出现的521问题
- 深度学习与自然语言处理实验——中文信息熵的计算
- R语言时间序列基础库zoo