java如何接入实时流_示例讲解如何用Java 8的流接口解析文件

Stream在Java 8中无处不在。你随便看一下肯定就会发现它的身影。java.io.BufferedReader也不例外。在Java 8中使用Stream API来解析文件简直太小儿科了。

我这有一个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 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);

}

}

}

相当简单,自我解释型的。类似的,我创建了一个方法来读取所有的记录。读取记录的算法如下:

打开资源文件进行读取

跳过首行

用分隔符分割行

对每行应用一个map操作,将行映射到一个字符串列表

下面是它的实现:

class CsvReader {

List> 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);

}

}

}

没什么特别的。你会注意到两个方法中的map是几乎一样的。事实上,它可以提取到一个变量里面:

Function> mapper

= line -> Arrays.asList(line.split(separator));

我写了个测试来完成整个过程。

public class CsvReaderTest {

@Test

public void readsHeader() {

CsvReader csvReader = createCsvReader();

List header = csvReader.readHeader();

assertThat(header)

.contains("username")

.contains("visited")

.hasSize(2);

}

@Test

public void readsRecords() {

CsvReader csvReader = createCsvReader();

List> 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);

}

}

}

标签:Java

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:慧都控件网

a6e1590ae4b228073faff3806334194e.png2

好文不易,鼓励一下吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值