将Files.walk转换为rxjava Flowable

时间:2019-06-10 13:49:57

标签: rx-java2

如何转换 从rxjava从Stream<Path> s = Files.walk(root)Flowable? 请注意,我们不能简单地使用Flowable.fromIterable(()->s.iterator()),因为Files.walk会抛出IOException。最简单的方法是从Files.walk收集结果,然后从可迭代的集合中创建Flowable,但这似乎不是惯用的方法。

1 个答案:

答案 0 :(得分:0)

我认为我找到了一种不错的方法。 Flowable.using()允许使用一些“底层”资源创建Flowable。如果Files.walk()IOException失败,则调用子订户的onError,并在完成“资源”后关闭(在这种情况下,java.util.stream.Stream具有路径)。

import io.reactivex.Flowable;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

final Flowable<Path> pathFlowable = Flowable.using(
        () -> Files.walk(Path.of("/nofile")),
        stream -> Flowable.fromIterable(stream::iterator),
        Stream::close
);
pathFlowable.subscribe(System.out::println, t -> System.out.println("Error " + t.toString()));