我正在尝试从阅读器读取行并将它们分组到属于一起的块。
来源文字:
bla1
bla2
### block separator ###
bla3
bla4
### block separator ###
...
我需要获得两个块(bla1,bla2)和(bla3,bla4)。
代码:
import org.apache.commons.lang3.StringUtils;
import rx.Observable;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.util.Iterator;
public class BlockBuilder {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("/path/to/some/file");
LineIterable lineIterable = new LineIterable(fileReader);
Observable.from(lineIterable)
.buffer(100)
// Needed instead of time/count: until line matches condition
// something like .buffer(line -> line.equals("### block separator ###")
.forEach(gatheredLines -> {
String gatheredBlock = StringUtils.join(gatheredLines, '\n');
System.out.println(gatheredBlock);
System.out.println("###### ###### ###### ######");
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static class LineIterable implements Iterable<String> {
private final Iterator<String> iterator;
public LineIterable(Reader reader) {
iterator = new BufferedReader(reader).lines().iterator();
}
@Override
public Iterator<String> iterator() {
return iterator;
}
}
}
如果使用缓冲区或窗口,或者考虑到这两者是完全错误的,这无关紧要。
我认为必须可以使用缓冲区的 bufferClosingSelector 或窗口的 closingSelector 。 两者都是创建Observer的函数,它可以触发当前缓冲区或窗口的关闭,但是我无法在这里看到我能抓住当前行的位置。
答案 0 :(得分:3)
您可以发布源并将其用于缓冲和缓冲区边界:
Observable<String> source = Observable.just(
"a", "b", "#",
"c", "d", "e", "#",
"f", "g");
source.publish(p ->
p.filter(v -> !"#".equals(v))
.buffer(() -> p.filter(v -> "#".equals(v))))
.subscribe(System.out::println);