我有以下代码段,它生成了Flowable<String>
。我不确定如何制作Files.lines
Autoclosable
。我需要传递iterator
作为第二个参数,以逐行读取第一行。
请注意,我没有像generate(Callable<S> initialState, BiConsumer<S,Emitter<T>> generator, Consumer<? super S> disposeState)
那样使用第三个参数(disposeState),因为将iterator
传递为disposeState
没有意义。
private Flowable<String> generateFlowable(File file) {
return Flowable.generate(
() -> Files.lines(Paths.get(file.toURI()), StandardCharsets.UTF_8).iterator(),
(iterator, emitter) -> {
if (iterator.hasNext()) {
emitter.onNext(iterator.next());
} else {
emitter.onComplete();
}
}
);
}
使用另一种方法逐行使用和解析行。当我确实运行lsof
时,我发现该处理程序未关闭。有人可以建议我怎么做吗?
答案 0 :(得分:1)
有两种可能的方法来自动关闭Flowable
。第一个是利用Flowable::using
:
private Flowable<String> generateFlowable(File file) {
return Flowable.using(
() -> Files.lines(file.toPath(), StandardCharsets.UTF_8),
stream -> Flowable.fromIterable(stream::iterator),
Stream::close
);
}
第二个正在使用Flowable::generate
,但确实使用了BufferedReader
:
private Flowable<String> generateFlowable(File file) {
return Flowable.generate(
() -> Files.newBufferedReader(Paths.get(file.toURI()), StandardCharsets.UTF_8),
(reader, emitter) -> {
String line = reader.readLine();
if (line != null) {
emitter.onNext(line);
} else {
emitter.onComplete();
}
}, BufferedReader::close);
}