文档章节

[Java] 使用ZipInputStream解析zip类文件(jar、docx)的范例

o
 osc_7dn4hojn
发布于 07/15 08:15
字数 581
阅读 42
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

作者: zyl910

一、缘由

现在zip类的文件越来越多了,例如jar、docx。
有时我们需批量处理这些文件中的数据,若都是手工操作的话就太麻烦了。于是考虑编程自动处理。
Java提供了ZipInputStream等zip的操作类。但是有些内容比较抽象,没有代码范例的话有点难以理解。例如zip中的目录究竟是什么。
于是我做个个Demo来演示如何用它来解析zip文件,输出信息。


二、源码

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipReadTest {
    public static void main(String[] args) {
        String srcPath = "target/classes/static/test.docx";
        try(FileInputStream is = new FileInputStream(srcPath)) {
            run(System.out, is);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("ZipReadTest done.");
    }

    private static void run(PrintStream out, InputStream is) throws IOException {
        try(ZipInputStream zis = new ZipInputStream(is)) {
            ZipEntry zipEntry;
            while ((zipEntry = zis.getNextEntry()) != null) {
                if (null==zipEntry) continue;
                String line = String.format("ZipEntry(%s, isDirectory=%d, size=%d, compressedSize=%d, time=%d, crc=%d, method=%d, comment=%s)",
                        zipEntry.getName(), (zipEntry.isDirectory())?1:0, zipEntry.getSize(), zipEntry.getCompressedSize(), zipEntry.getTime(), zipEntry.getCrc(), zipEntry.getMethod(), zipEntry.getComment());
                out.println(line);
            }
        }
    }
}

三、测试结果

对一个docx文件进行处理,测试结果如下:

ZipEntry([Content_Types].xml, isDirectory=0, size=1344, compressedSize=354, time=312739200000, crc=1239027019, method=8, comment=null)
ZipEntry(docProps/app.xml, isDirectory=0, size=289, compressedSize=183, time=312739200000, crc=4091958464, method=8, comment=null)
ZipEntry(docProps/core.xml, isDirectory=0, size=392, compressedSize=220, time=312739200000, crc=3065131828, method=8, comment=null)
ZipEntry(word/document.xml, isDirectory=0, size=36724, compressedSize=4017, time=312739200000, crc=1830572178, method=8, comment=null)
ZipEntry(word/fontTable.xml, isDirectory=0, size=2120, compressedSize=398, time=312739200000, crc=268271083, method=8, comment=null)
ZipEntry(word/numbering.xml, isDirectory=0, size=2868, compressedSize=502, time=312739200000, crc=3349595521, method=8, comment=null)
ZipEntry(word/settings.xml, isDirectory=0, size=815, compressedSize=325, time=312739200000, crc=773262145, method=8, comment=null)
ZipEntry(word/styles.xml, isDirectory=0, size=8628, compressedSize=1319, time=312739200000, crc=2957985579, method=8, comment=null)
ZipEntry(_rels/.rels, isDirectory=0, size=588, compressedSize=228, time=312739200000, crc=1578830051, method=8, comment=null)
ZipEntry(word/media/image1.emf, isDirectory=0, size=881176, compressedSize=97920, time=312739200000, crc=1974652776, method=8, comment=null)
ZipEntry(word/_rels/document.xml.rels, isDirectory=0, size=980, compressedSize=283, time=312739200000, crc=2086150245, method=8, comment=null)
ZipReadTest done.

以上就是docx内的文件结构。

平时使用WinZip等文件来查看zip类文件时,是显示为树形结构。但是在zip文件中实际上记录的是相对路径。
zip文件类一般不用记录目录,只记录相对路径就行。
当需要记录目录时,ZipEntry的name以分隔符结尾(如 word/),相关数据流为空。

参考文献

o
粉丝 0
博文 86
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.1K
18
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
702
1
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3

没有更多内容

加载失败,请刷新页面

加载更多

处理“ java.lang.OutOfMemoryError:PermGen空间”错误

问题: Recently I ran into this error in my web application: 最近,我在Web应用程序中遇到此错误: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError:PermGen空间......

技术盛宴
今天
7
0
从JS数组中删除重复的值[duplicate] - Remove duplicate values from JS array [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : Get all unique values in a JavaScript array (remove duplicates) (79 answers) 获取JavaScript数组中的......

法国红酒甜
今天
11
0
如何使用AngularJS在浏览器的控制台中访问$ scope变量?

问题: I would like to access my $scope variable in Chrome's JavaScript console. 我想在Chrome的JavaScript控制台中访问$scope变量。 How do I do that? 我怎么做? I can neither see ......

fyin1314
今天
18
0
ImageMagick - 添加水印

背景 最近制作思维导图想添加自己的水印,网上很多例子都是使用ImageMagick来完成。但是不少代码在本地并不可行。经过一番试验,找到两个方法。 方法一 代码 stackoverflow方法改良: conver...

wffger
今天
11
0
OSChina 周四乱弹 —— 到底是怎样的饕餮盛宴在等待着我!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐 :《你 能 來 保 護 我 的 世 界 嘛》- 歪门 《你 能 來 保 護 我 的 世 界 嘛》- 歪门 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
91
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部