Zip文件的解析与生成
一、Zip文件的解析
在解压zip文件时,有一类专门的输入流ZipInputStream,继承自FilterInputStream,用来实现Zip文件的读取,这类输入流是完成特定功能的输入流,采用java设计模式中的装饰器模式,要配合InputStream类型的输入流一起使用,完成zip文件的解析。
在解析zip文件的时候,第一步要先建立解压缩后的目录,然后获取zip文件的名称,根据名称确定解压缩后的文件目录,然后创建目录。
第二步要先遍历zip文件中的每一个子文件,每一个子文件都是ZipEntry类型的对象,使用getNextEntry()方法把每一个子文件读取出来,然后获取每个子文件的名称,确定解压缩以后的文件路径,创建每一个文件的输入流,使用BufferedOutputStream批量读取子文件的内容,循环调用上述步骤,直到读取完毕。
实现代码如下:
package com.yx.demo;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;/*** * 解压缩zip文件**/
public class Demo01 {public static void main(String[] args) {//要进行解压缩的文件File zipFile = new File("d:\\test\\1-201023201325.zip");//1创建解压缩目录//获取zip文件名称String zipFileName = zipFile.getName();//根据zip文件名称,提取压缩目录的名称String targetDirName = zipFileName.substring(0,zipFileName.indexOf("."));//创建压缩目录File targetDir = new File(zipFile.getParent() + "\\" + targetDirName);if(!targetDir.exists()) {targetDir.mkdir(); //创建目录}//2.解析读取zip文件try (ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile),Charset.forName("gbk"))) {//遍历Zip文件中每个子文件ZipEntry zipEntry = null; while((zipEntry = in.getNextEntry())!= null) {//获取zip压缩包中的子文件名称String zipEntryFileName = zipEntry.getName();String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;//创建该文件的输出流try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFilePath));){//读取该子文件的字节内容byte[] buff = new byte[1024];int len = -1;while((len = in.read(buff))!= -1) {bos.write(buff, 0, len);}}}} catch (IOException e) {e.printStackTrace();}}
}
二、生成zip文件
ZipOutputStream是zip文件的指定输出流,是FilterOutputStream的子类,它的作用是可以直接将文件直接写入zip包,同样采用装饰器模式,配合FileOutputStream使用。
生成zip文件的第一步是先获取原文件的原始目录,根据原目录生成同一级目录下压缩后的压缩文件目录,第二步创建File类型的数组调用listFiles()方法t通过foreach循环获取所有子文件,第三步创建zipEntry类型的对象,调用 ZipOutputStream的putNextEntry()方法获取子文件的内容,使用write()方法配合Files工具类readAllBytes()方法将原子文件的内容全部写入zip压缩包,全部写入以后,调用closeEntry()方法关闭zipEntry。
实现代码如下:
package com.yx.demo;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文件**/
public class Demo02 {public static void main(String[] args) {//原始目录File rootDir = new File("d:\\test\\img");//将原始目录中的文件,“写入”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文件的解析与生成相关推荐
- (五)DOM4j进行XML文件的解析及生成
DOM4j本身还是需要使用SAX建立解析器,然后通过文档依次找到根节点,再通过根节点查找每一个节点的内容. 1.写操作 import java.io.File; import java.io.File ...
- 【无标题】JAVA解压ZIP文件并解析Excel(easyExcel)
返回值我用的是公司自定义的FT框架 具体返回值根据公司而定 一般在上传文件,PDF,Excel,zip压缩包时 后端基本都用MultipartFile接收 一定加上Http请求方便后续拼接路径 需求: ...
- 【Web技术】959- JavaScript 如何在线解压 ZIP 文件?
相信大家对 ZIP 文件都不会陌生,当你要打开本地的 ZIP 文件时,你就需要先安装支持解压 ZIP 文件的解压软件.但如果预解压的 ZIP 文件在服务器上,我们应该如何处理呢? 最简单的一种方案就是 ...
- Python 标准库 —— zipfile(读取 zip 文件)
Python模块学习:zipfile zip文件操作 Python 学习入门(16)-- zipfile 0. 解压 with zipfile.ZipFile('../data/jaychou_lyr ...
- java代码使用http请求解压zip包并解析xml_Javascript 是如何解析 Excel 文件的?
最近要做一个导入导出 Excel 的功能,上一次做这个功能的时候,还是用的 Java Apache POI,这是一个用 Java 编写的免费开源的跨平台的 Java API,能够对 Microsoft ...
- python 实现文件的批量压缩为.zip格式+.zip格式文件的解析
python 实现文件的批量压缩为.zip格式+.zip格式文件的解析 python 实现文件的批量压缩为.zip格式 Python解析.zip文件的常见函数 python 实现文件的批量压缩为.zi ...
- 多线程 -之对Zip压缩文件的解析
需求背景 接到需求是要对商家提供的数据文件解析为对应我们业务需要的对象,由于商家给的文件是zip文件,大小在10-100M直接,如果用单个线程处理解析势必会影响处理速度, 以下是我们解析时候写的代码. ...
- python在内存中生成Zip文件!
python在内存中生成Zip文件! - 天真的好蓝啊 - 博客园 python在内存中生成Zip文件! import zipfile import StringIO class MemoryZipF ...
- dom解析和生成XML文件
使用这种方式解析时,需要使用node.getNodeType() == Node.ELEMENT_NODE判断结点是否为元素结点,否则会输出很多#text(结点前有空格存在的原因). 完成的XML解析 ...
最新文章
- redis延迟队列 如何确保成功消费_千万级延时任务队列如何实现,看美图开源的-LMSTFY...
- 链表python笔试题目_python经典面试算法题1.4:如何对链表进行重新排序
- Git中Add后对部分文件进行取消
- Vertex Texture Fetch(VTF) Fragment Texture Fetch ( FTF )
- Educational Codeforces Round 84 (Rated for Div. 2) D. Infinite Path 构建环 + 思维
- 语音识别现在发展到什么阶段了?
- 安卓开发学习笔记—————《Anroid编程权威指南》第六章 Android编程与兼容性问题...
- 4K视频质量测试/4K质量评价
- 泛微E8调整附件大小和属性
- C语言 pow函数 undefined reference to `pow‘ 已解决
- 新云人才招聘系统抖音小程序申请配置教程
- 年末固定资产盘点季,企业如何快速盘点固定资产?
- 利用pygame写星球大战小游戏
- 计算机用户guest无法删除吗,win7怎样删除guest账户_win7删除guest账户的步骤
- 基于反馈的动态补偿模型
- php读取加密sqlite,加密你的SQLite
- java卸载错误2503_修复控制面板卸载程序时提示错误代码2502、2503的方法
- 国际高性能计算和人工智能咨询委员会公布第五届亚太区 HPC-AI竞赛结果
- Android KK平台的一个bug----在收到内容只有一个“=”的信息后,手机自动重启
- 你了解多线程自旋锁、互斥锁、递归锁等锁吗?