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

r8uurelv  于 2022-10-22  发布在  Java
关注(0)|答案(2)|浏览(181)

对于基本问题,我很抱歉…我有一个函数,它接受一个包含文件内容的InputStream,并返回一个对象列表,比如Person。
输入文件的每一行都包含一个人,所以我想逐行解析它。没有什么困难,但是…这次我想使用React式编程。
类似于:

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

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

jdgnovmf

jdgnovmf1#

可以使用BufferedReaderlines方法创建Stringstream
返回Stream,其元素是从BufferedReader读取的行。
代码与此类似:

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

所以你的代码应该是这样的:

public List<Person> parse(final InputStream is) throws IOException {
    CharSet cs = ... // Use the right charset for your file
    Stream<String> lines = new BufferedReader(new InputStreamReader(is, cs)).lines();
    return  lines
            .map(Person::new)   
            .collect(toList());
}
syqv5f0l

syqv5f0l2#

根据您的代码,您不需要实现行的Observable,因为您希望以后使用Java的Streams。您不能从Rx移回java流。
但如果你想完全基于Observable,你可以从以下开始:

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

相关问题