Rx java Vertx RxJava运算符迭代不过滤内容

Rx java Vertx RxJava运算符迭代不过滤内容,rx-java,reactive-programming,rx-java2,vert.x,rx-java3,Rx Java,Reactive Programming,Rx Java2,Vert.x,Rx Java3,我从文件中读取内容,我使用新行分隔符将一些名称放入文件中,但在通过vertx文件系统读取文件时,我无法提供所需的过滤器。每次打印文件的所有数据 以下是代码片段:- vertx.fileSystem().open("data.txt", new OpenOptions(), handler -> { final AsyncFile asyncFile = handler.result(); final Obs

我从文件中读取内容,我使用新行分隔符将一些名称放入文件中,但在通过vertx文件系统读取文件时,我无法提供所需的过滤器。每次打印文件的所有数据

以下是代码片段:-

vertx.fileSystem().open("data.txt", new OpenOptions(), handler -> {
                final AsyncFile asyncFile = handler.result();
                final Observable<Buffer> observable = asyncFile.toObservable();
                observable.subscribe(item -> {
                    final String[] split = item.toString().split("\n\r");
                    List<String> list = Arrays.asList(split);
                    final Observable<String> stringObservable = Observable.fromIterable(list);
                    stringObservable
                            .filter(name -> name.toString().startsWith("R"))
                            .take(2)
                            .subscribe(str -> System.out.println(str), err -> System.out.println(err), () -> System.out.println("Inner loop completed"));


                }, error -> System.out.println(error), () -> System.out.println("Completed !!!"));
            });

我在发现上述可观察对象后使用的内部可观察对象可以一次性获得文件的所有数据。

如果我在\n而不是\n\r上拆分,则此代码片段实际上对我很有用。如果您在打印所有内容时遇到问题,我猜整个文件中的第一个字符是R,而实际上文件中没有\n\R。因此,当您尝试拆分时,只会得到一个包含整个文件的大字符串

也就是说,您可以通过使用rxOpen而不是open来显著简化此代码,避免嵌套子脚本,并简化如何将缓冲区转换为可观察的对象,从而发射缓冲区中的每一行

还请注意,我曾经使用\n字符作为分隔符将文件内容拆分为标记。仅仅使用toObservable直接将AsyncFile转换为一个可观察的文件,可能会导致缓冲区在一行的中途被截断,这将破坏您的解析

因此,把所有这些放在一起:

vertx.fileSystem.rxOpendata.txt,新的OpenOptions .flatmapobserveaf->RecordParser.newDelimited\n,af.toObservable .mapBuffer::toString .filtername->name.startsWithR .take2 .subscribeSystem.out::println,System.err::println,->System.out.println已完成;
从13行到6行。

如果我在\n而不是\n\r上拆分,这个代码片段实际上对我来说很好。如果您在打印所有内容时遇到问题,我猜整个文件中的第一个字符是R,而实际上文件中没有\n\R。因此,当您尝试拆分时,只会得到一个包含整个文件的大字符串

也就是说,您可以通过使用rxOpen而不是open来显著简化此代码,避免嵌套子脚本,并简化如何将缓冲区转换为可观察的对象,从而发射缓冲区中的每一行

还请注意,我曾经使用\n字符作为分隔符将文件内容拆分为标记。仅仅使用toObservable直接将AsyncFile转换为一个可观察的文件,可能会导致缓冲区在一行的中途被截断,这将破坏您的解析

因此,把所有这些放在一起:

vertx.fileSystem.rxOpendata.txt,新的OpenOptions .flatmapobserveaf->RecordParser.newDelimited\n,af.toObservable .mapBuffer::toString .filtername->name.startsWithR .take2 .subscribeSystem.out::println,System.err::println,->System.out.println已完成;
从13行到6行。

你确定buff包含整个文件,所以你不需要处理只加载了部分行而拆分不起作用的情况吗?@skywall啊,是的,我认为你是对的,足够大的文件可能会拆分为多个缓冲区。我将编辑我的答案。@skywall我更新了我的答案,以说明一个文件返回了多个缓冲区。@dano,没有帮助,仍然得到相同的响应。没有操作员working@RavatTailor您需要提供一个示例data.txt,但它不起作用或其他什么,因为您问题中的代码和我答案中的代码,使用我为data.txt提供的虚拟数据,这两种方法都可以很好地工作。你确定buff包含整个文件,所以你不需要处理只加载了一部分行,而split在这种情况下无法工作的情况吗?@skywall啊,是的,我想你是对的,足够大的文件可能会被分割成多个缓冲区。我将编辑我的答案。@skywall我更新了我的答案,以说明一个文件返回了多个缓冲区。@dano,没有帮助,仍然得到相同的响应。没有操作员working@RavatTailor您需要提供一个示例data.txt,但它不起作用或其他什么,因为您问题中的代码和我答案中的代码,使用我为data.txt提供的虚拟数据,这两种方法都很好。您能提供输入文本文件吗?因为前面的答案完全正确。@Pendula文件在每一行中都包含一些随机名称,如Rat\n Ravat\n Romania\n India\n Africa,请\n作为新行我的答案与该输入文件正确匹配-它输出Rat\nRavat\n已完成。您能提供输入文本文件吗?因为上一个答案完全正确。@Pendula文件在每一行中都包含一些随机名称,如Rat\n Ravat\n Romania\n India\n Africa,请\n作为新行,我的答案与该输入文件正确匹配-它输出Rat\nRavat\n已完成。