Java 如何从InputStream创建基于行的可观察对象?
很抱歉问了一个基本的问题。。。 我有一个函数,它接受带有文件内容的InputStream,并返回对象列表,比如Person 输入文件的每一行都包含一个人,所以我想逐行解析它。 没有什么困难,但是。。。这次我想使用反应式编程 比如: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
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。