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

我有一个要读取的CSV文件。 下面的例子:

username;visited
jdoe;10
kolorobot;4

我的阅读器的一项合同是提供标头作为字符串列表,并提供所有记录作为字符串列表。 我的阅读器接受java.io.Reader作为阅读源。

我将从阅读标题开始。 读取标头的算法如下:

  • 打开阅读源,
  • 获取第一行并进行解析,
  • 用分隔符分割线,
  • 获取第一行并进行解析,
  • 将行转换为字符串列表并返回。

并执行:

class CsvReader {private static final String SEPARATOR = ";";private final Reader source;CsvReader(Reader source) {this(source);}List<String> readHeader() {try (BufferedReader reader = new BufferedReader(source)) {return reader.lines().findFirst().map(line -> Arrays.asList(line.split(SEPARATOR))).get();} catch (IOException e) {throw new UncheckedIOException(e);}}
}

很简单。 不言自明。 同样,我创建了一种读取所有记录的方法。 读取记录的算法如下:

  • 打开阅读源,
  • 跳过第一行,
  • 用分隔符分割线,
  • 在将行映射到字符串列表的每一行上应用一个映射器。

并执行:

class CsvReader {List<List<String>> readRecords() {try (BufferedReader reader = new BufferedReader(source)) {return reader.lines().substream(1).map(line -> Arrays.asList(line.split(separator))).collect(Collectors.toList());} catch (IOException e) {throw new UncheckedIOException(e);}}
}

这里没什么好看的。 您可能会注意到,这两种方法中的映射器完全相同。 实际上,可以很容易地将其提取为变量:

Function<String, List<String>> mapper = line -> Arrays.asList(line.split(separator));

最后,我创建了一个简单的测试。

public class CsvReaderTest {@Testpublic void readsHeader() {CsvReader csvReader = createCsvReader();List<String> header = csvReader.readHeader();assertThat(header).contains("username").contains("visited").hasSize(2);}@Testpublic void readsRecords() {CsvReader csvReader = createCsvReader();List<List<String>> records = csvReader.readRecords();assertThat(records).contains(Arrays.asList("jdoe", "10")).contains(Arrays.asList("kolorobot", "4")).hasSize(2);}private CsvReader createCsvReader() {try {Path path = Paths.get("src/test/resources", "sample.csv");Reader reader = Files.newBufferedReader(path, Charset.forName("UTF-8"));return new CsvReader(reader);} catch (IOException e) {throw new UncheckedIOException(e);}}
}

翻译自: https://www.javacodegeeks.com/2014/05/parsing-a-file-with-stream-api-in-java-8.html

在Java 8中使用Stream API解析文件相关推荐

  1. 在Java 8中使用Stream API列出ZIP文件的内容

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

  2. Java SE 9:Stream API的改进

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

  3. Java 8 中的 Streams API 详解

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

  4. 从Java 11中删除的API

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

  5. java io 文件路径_如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径...

    如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径 我有一个包含2个包的项目: ListStopWords.txt ListStopWords.txt 在包(2)中我有 ...

  6. Java实现pdf转tex_使用Free Spire.PDF在Java程序中创建和转换PDF文件

    在这篇文章中,我将举例说明如何创建一个包含标题,段落,图像,编号列表和表格的简单的PDF文件,以及如何使用Free Spire.PDF将PDF转换为其他文件格式. 概述 Free Spire.PDF ...

  7. 在Java程序中创建和转换PDF文件

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 作者: Codingqi123 来源: jianshu.com/p/db15232987 ...

  8. java 8 中文字体_在java程序中直接使用中文字体文件

    在java程序中直接使用中文字体文件.代码中的hb.ttf文件请用你自己的中文字体文件代替 java学习 java培训 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际 ...

  9. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 参考文章: (1)解决java web中safari浏览器下载后文件中文乱码问题 (2)https://www.cnblogs.com/ ...

最新文章

  1. 关于cookie的文章(cookie与session机制)
  2. MATLAB——nctoolbox安装及使用
  3. c语言ssl通信,利用 OpenSSL 的 C/S 安全通信程序设计
  4. Chapter 7 Windows下pycaffe的使用之draw_net.py
  5. 团队项目第一篇——NABCD
  6. 陆正耀为瑞幸数据造假道歉:非常自责 会全力挽回损失
  7. 物流系统车辆仓库定位的实现——基于RFID定位的实现方法
  8. PLM 问卷调查表-A 关于公司
  9. 我拿什么拯救你,混乱的思维?不如试试这3款神器
  10. leetcode 名单 Insertion Sort List
  11. aix中c语言生成pdf文档,利用PDFLib生成PDF文档
  12. linux查看cuda驱动程序,我的nvidia驱动程序的正确CUDA版本是什么?
  13. 微信小程序使用font awsome图标库(最新fontawsome5)
  14. Commit cannot be completed since the group has already rebalanced and assign
  15. iOS开发除了XCode还需要掌握的8个重要工具,让您开发更容易
  16. C语言实验题目[01]
  17. 你应该在你的域名中使用www吗?
  18. 主引导记录(MBR)信息分析与获取
  19. 【QtScrcpy】开源的投屏控制软件 - 安利
  20. 交换机与路由器技术-03-交换机基本配置

热门文章

  1. 2018蓝桥杯省赛---java---C---3(字母阵列)
  2. JAVA代码实现按列表中元素的时间字段排序
  3. 系统架构设计师考试 重要的部分
  4. GitLab创建项目 命令上传代码
  5. guid判断是否有效_让我们一起啃算法----有效的括号
  6. 最大子序列和问题的解(共4种,层层推进)
  7. selenium自动化测试_Selenium测试可实现有效的测试自动化
  8. 笔试知识点 网络安全_安全点
  9. oauth2和jwt_OAuth2,JWT,Open-ID Connect和其他令人困惑的事物
  10. 设计模式示例_介体设计模式示例