Я думаю, следующий код даст то, что вы хотите
@Test
public void reactiveParser() throws InterruptedException {
ConnectableFlux<String> letters = Flux.create((Consumer<? super FluxSink<String>>) t -> {
char[] chars = "sfdsfsdf/sdf/sdfs/dfsdfsd/fsd/fsd/fs/df/sdf".toCharArray();
for (char c : chars) {
t.next(String.valueOf(c));
}
}).publish();
letters
.window(
letters.filter( t -> t.equals("/"))
)
.flatMap( t -> t.collectList())
.map( t -> t.stream().collect(Collectors.joining()))
.subscribe(t -> {
System.out.println(t);
});
letters.connect();
}
В приведенном выше примере используется проектный реактор.Это довольно крутой способ делать реактивные вещи внутри Java.
В следующем коде можно выполнить множество оптимизаций.Не использовать строки для представления одной буквы будет одним из них.
Но основная идея есть.Вы создаете поток / наблюдаемый, который испускает буквы по мере их поступления, и делаете его видимым для совместного использования (вам нужно показывать поверх излучаемых значений), а затем просто собираете их в единую строку.Код ниже должен дать следующий вывод:
sfdsfsdf
/sdf
/sdfs
/dfsdfsd
/fsd
/fsd
/fs
/df
Конечно, вы должны использовать неблокирующее соединение, чтобы байты могли считываться асинхронно.