如何在Flowable.generate

时间:2018-11-02 00:54:05

标签: java java-8 stream rx-java rx-java2

我有以下代码段,它生成了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时,我发现该处理程序未关闭。有人可以建议我怎么做吗?

1 个答案:

答案 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);
}