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

Java 如何从InputStream创建基于行的可观察对象?,java,inputstream,reactive-programming,Java,Inputstream,Reactive Programming,很抱歉问了一个基本的问题。。。 我有一个函数,它接受带有文件内容的InputStream,并返回对象列表,比如Person 输入文件的每一行都包含一个人,所以我想逐行解析它。 没有什么困难,但是。。。这次我想使用反应式编程 比如: public List<Person> parse(final InputStream is) throws IOException { return //create an observable wich will split the i

很抱歉问了一个基本的问题。。。 我有一个函数,它接受带有文件内容的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());
}
公共列表解析(最终输入流为)引发IOException{
返回
//创建一个可观察项,将输入拆分为多行,“\n”
.map(个人::新建)
.collect(toList());
}

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

您可以使用
BufferedReader
的方法创建
字符串的
流:

返回一个
,其中的元素是从此
缓冲读取器
读取的行

代码与此类似:

Stream<String> lines = new BufferedReader(new InputStreamReader(is, cs)).lines();
streamlines=newbufferedreader(newinputstreamreader(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());
}  
公共列表解析(最终输入流为)引发IOException{
CharSet cs=…//为文件使用正确的字符集
Streamlines=新的BufferedReader(新的InputStreamReader(is,cs)).lines();
回程线
.map(个人::新建)
.collect(toList());
}  

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

        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);
            ...
        }
try(BufferedReader=new BufferedReader(new InputStreamReader(is))){
Observable linesObs=Observable.from(reader.lines()::迭代器);
//在rxjava v2中:
//Observable linesObs=Observable.fromIterable(reader.lines()::迭代器);
...
}

我看到了这个问题,但我无法实现Flowable.fromIterable(…)或observatable.toIterable(…)。我刚刚找到了一个类似的解决方案,但我没有使用字符集:BufferedReader br=new BufferedReader(new InputStreamReader(is));返回br.lines().map(…)。。。。;是一样的吗?文件是(丑陋的)ASCII格式。@fresko Yes如果文件是使用JVM的默认字符集编写的,则没有字符集的构造函数“使用默认字符集”问题作者希望使用反应式编程。您的解决方案不使用反应式编程。此处的次要更正:这应该是
可观察的。fromIterable(
..
,而不是
可观察的。from(
..
我接受更正。我用的是旧的rx.Observable,而你说的是io.reactivex.Observable。