如何从InputStream创建基于行的可观察对象?

时间:2019-02-05 14:06:14

标签: java inputstream reactive-programming

很抱歉出现基本问题... 我有一个函数,该函数接受带有文件内容的InputStream并返回对象列表,比如说Person。

输入文件的每一行都包含一个人,因此我想按行对其进行解析。 没什么难的,但是...这次我想使用反应式编程。

类似:

public List<Person> parse(final InputStream is) throws IOException {
    return
    //create an observable wich will split the input in many lines, "\n"
            .map(Person::new)
            .collect(toList());
}

我错过了注释的步骤,即创建一个不是基于字节而是基于行的可观察对象。

2 个答案:

答案 0 :(得分:3)

您可以使用stream的方法lines创建String的{​​{1}}:

  

返回一个BufferedReader,其元素是从该Stream读取的行。

具有与此类似的代码:

BufferedReader

所以您的代码应类似于:

Stream<String> lines = new BufferedReader(new InputStreamReader(is, cs)).lines();

答案 1 :(得分:1)

根据您的代码,您无需实现行的Observable,因为您以后希望使用Java的Streams。您不能从Rx移回Java流。

但是,如果您想完全基于Observables,则可以从以下内容开始:

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
            Observable<String> linesObs = Observable.from(reader.lines()::iterator);
            ...
        }