在Java 8 java.util.zip.ZipFile配备了stream方法,该方法可以非常轻松地浏览ZIP文件条目。 在此博客文章中,我将展示许多示例,这些示例显示了我们可以如何快速浏览ZIP文件条目。

注意:就本博客而言,我将一个GitHub存储库下载为ZIP文件,并将其复制到c:/tmp

Java 7之前的版本

在Java 7之前的Java中读取ZIP文件条目有点麻烦……难道是吗? 这是在查看以下代码时开始讨厌Java的方式:

public class Zipper {public void printEntries(PrintStream stream, String zip)  {ZipFile zipFile = null;try {zipFile = new ZipFile(zip);Enumeration<? extends ZipEntry> entries = zipFile.entries();while (entries.hasMoreElements()) {ZipEntry zipEntry = entries.nextElement();stream.println(zipEntry.getName());}} catch (IOException e) {// error while opening a ZIP file} finally {if (zipFile != null) {try {zipFile.close();} catch (IOException e) {// do something}}}}
}

Java 7

使用Java 7,这可以简单得多–感谢try-with-resources但是我们仍然被“强制”使用Enumeration来浏览ZIP文件条目:

public class Zipper {public void printEntries(PrintStream stream, String zip) {try (ZipFile zipFile = new ZipFile(zip)) {Enumeration<? extends ZipEntry> entries = zipFile.entries();while (entries.hasMoreElements()) {ZipEntry zipEntry = entries.nextElement();stream.println(zipEntry.getName());}} catch (IOException e) {// error while opening a ZIP file}}
}

使用流API

真正的乐趣始于Java8。从Java 8开始, java.util.zip.ZipFile具有一个新的方法stream ,该方法流通过ZIP文件条目返回有序流。 在使用Java处理ZIP文件时,这提供了很多机会。 前面的示例可以用Java 8如下编写:

public class Zipper {public void printEntries(PrintStream stream, String zip) {try (ZipFile zipFile = new ZipFile(zip)) {zipFile.stream().forEach(stream::println);} catch (IOException e) {// error while opening a ZIP file}}
}

借助Stream API,我们可以通过多种方式ZipFile 。 见下文…

过滤和排序ZIP文件内容

public void printEntries(PrintStream stream, String zip) {try (ZipFile zipFile = new ZipFile(zip)) {Predicate<ZipEntry> isFile = ze -> !ze.isDirectory();Predicate<ZipEntry> isJava = ze -> ze.getName().matches(".*java");Comparator<ZipEntry> bySize = (ze1, ze2) -> Long.valueOf(ze2.getSize() - ze1.getSize()).intValue();zipFile.stream().filter(isFile.and(isJava)).sorted(bySize).forEach(ze -> print(stream, ze));} catch (IOException e) {// error while opening a ZIP file}
}private void print(PrintStream stream, ZipEntry zipEntry) {stream.println(zipEntry.getName() + ", size = " + zipEntry.getSize());
}

遍历ZIP条目时,我检查该条目是否为文件,并且是否与给定名称匹配(为简单起见,在本示例中进行了编码),然后使用给定的比较器按大小对它进行排序。

创建ZIP文件的文件索引

在此示例中,我按文件名的首字母对ZIP条目进行分组,以创建Map<String, List<ZipEntry>>索引。 预期结果应类似于以下内容:

a = [someFile/starting/with/an/A]
u = [someFile/starting/with/an/U, someOtherFile/starting/with/an/U]

同样,使用Stream API确实很容易:

public void printEntries(PrintStream stream, String zip) {try (ZipFile zipFile = new ZipFile(zip)) {Predicate<ZipEntry> isFile = ze -> !ze.isDirectory();Predicate<ZipEntry> isJava = ze -> ze.getName().matches(".*java");Comparator<ZipEntry> bySize =(ze1, ze2) -> Long.valueOf(ze2.getSize()).compareTo(Long.valueOf(ze1.getSize()));Map<String, List<ZipEntry>> result = zipFile.stream().filter(isFile.and(isJava)).sorted(bySize).collect(groupingBy(this::fileIndex));result.entrySet().stream().forEach(stream::println);} catch (IOException e) {// error while opening a ZIP file}
}private String fileIndex(ZipEntry zipEntry) {Path path = Paths.get(zipEntry.getName());Path fileName = path.getFileName();return fileName.toString().substring(0, 1).toLowerCase();
}

在ZIP文件条目中查找文本

在最后一个示例中,我在所有带有java扩展名的文件中搜索@Test文本出现的地方。 这次,我将利用BufferedReaderlines方法返回行流。

public void printEntries(PrintStream stream, String zip) {try (ZipFile zipFile = new ZipFile(zip)) {Predicate<ZipEntry> isFile = ze -> !ze.isDirectory();Predicate<ZipEntry> isJava = ze -> ze.getName().matches(".*java");List<ZipEntry> result = zipFile.stream().filter(isFile.and(isJava)).filter(ze -> containsText(zipFile, ze, "@Test")).collect(Collectors.toList());result.forEach(stream::println);} catch (IOException e) {// error while opening a ZIP file}
}private boolean containsText(ZipFile zipFile, ZipEntry zipEntry, String needle) {try (InputStream inputStream = zipFile.getInputStream(zipEntry);BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {Optional<String> found = reader.lines().filter(l -> l.contains(needle)).findFirst();return found.isPresent();} catch (IOException e) {return false;}
}

摘要

Java 8中的Stream API是一种功能强大的解决方案,可帮助轻松解决相对简单的任务。 我认为这就是它的力量。

本文中提供的示例相对简单,它们仅为可视化目的而创建。 但我希望您喜欢它们并发现它们有用。

资源资源

  • http://docs.oracle.com/javase/tutorial/index.html

翻译自: https://www.javacodegeeks.com/2014/06/listing-a-zip-file-contents-with-stream-api-in-java-8.html

在Java 8中使用Stream API列出ZIP文件的内容相关推荐

  1. 在Java 8中使用Stream API解析文件

    Java 8中到处都有流.只需四处看看,可以肯定地找到它们. 它也适用于java.io.BufferedReader . 使用Stream API在Java 8中解析文件非常容易. 我有一个要读取的C ...

  2. electron 解压zip_如何在Electron Framework中提取.zip文件的内容(解压缩)

    本文概述 必须先将其解压缩, 然后才能开始实际使用zip文件中的内容(文件).在本文中, 你将学习如何使用Electron Framework和decompress-zip模块解压缩.zip文件. 要 ...

  3. 从Java 11中删除的API

    在看到一些Java 10中删除了API之后, Java 11 ( JSR 384 )看起来将删除更多API. 在最近的OpenJDK java-se-spec-experts邮件列表帖子" ...

  4. Java SE 9:Stream API的改进

    发表简要目录: (Post Brief Table of Content:) Introduction介绍 Java SE 8: Stream API BasicsJava SE 8:Stream A ...

  5. Java 8 中的 Streams API 详解

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作,或者大批量数据操作 .Stream API 借助于同样新出现的 L ...

  6. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

  7. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

    Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 参考文章: (1)Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 (2)https://www.cnblog ...

  8. 关于Java项目中,word和Excel类型文件的预览功能实现

    关于Java项目中,word和Excel类型文件的预览功能实现 背景 Aspose说明 Aspose.Words Aspose.Cells pom依赖引入 引入license.xml(授权文件) 创建 ...

  9. DCMTK:列出dicom文件的内容

    DCMTK:列出dicom文件的内容 列出dicom文件的内容 列出dicom文件的内容 #include "dcmtk/config/osconfig.h" #include & ...

最新文章

  1. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程
  2. node重命名文件名_利用Node.js对文件进行重命名
  3. redis3.2.3安装部署实战
  4. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
  5. C/C++位域结构深入解析
  6. Qt值得学习吗?详解Qt的几种开发方式
  7. JavaScript | 如何为变量分配十进制,八进制和十六进制值?
  8. Pyalgotrade量化交易回测框架
  9. 我们变成了最小的,当我们发现不了最弱小的时候
  10. 面试(2)——StringBuffer StringBuilder String /==与equals
  11. python整数类型进制表示_Python数据类型--整型
  12. Centos Openssl升级
  13. iperf3怎么看结果_iperf3命令使用
  14. MATLAB图像处理(均值滤波)
  15. 基于Opencv的图像处理-高光调整算法
  16. Zabbix-3.0.X 监测服务器硬盘IO状态
  17. 制作古装人物彩色工笔画图片的PS教程
  18. 抓住那头牛(宽搜bfs)
  19. Android电源管理介绍
  20. springboot+vue(elementui)校园论坛网站源码

热门文章

  1. 153. 寻找旋转排序数组中的最小值---LeetCode---JAVA
  2. HBase出现java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration问题
  3. docker 买了腾讯服务器后的学习
  4. echarts line 去掉最外围方框_干货 | 关于射频芯片最详细解读
  5. java编译器API——使用编译工具
  6. 不相交集ADT(联机算法 + 脱机算法)
  7. 后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如
  8. apache kafka_Apache Kafka消费者再平衡
  9. graalvm_GraalVM上的Picocli:极快的命令行应用程序
  10. 叉叉框架_叉/连接框架