我有一个具有以下布局的日志文件
2018-01-01 01:01:00.000 Text
Text
Text
2018-01-01 01:02:00.000 Text
Text
2018-01-01 01:02:10.000
每个日志事件都以时间戳开始并以空行结束。我想用流或迭代器来处理这个问题,以便为每个事件获取一个字符串。有什么优雅的方法可以做到这一点?在 Python 中,我会遍历这些行并在找到空行后生成事件。我有点不知道如何在 Java 中执行此操作。
最佳答案
我会把它写成Iterator
。
获取Stream<String>
,询问其Iterator
;然后创建一个采用 Iterator<String>
的方法并返回 Iterator<LogEvent>
.
然后将其转回 Stream<LogEvent>
.
现在我们假设 LogEvent
有这样的东西:
class LogEvent {
static Builder builder() {
return new Builder();
}
static class Builder {
Builder appendLine(final String line) {
//do stuff
return this;
}
LogEvent build() {
//validate?
return new LogEvent();
}
}
}
那么这样的事情就会起作用:
Iterator<LogEvent> toLogEvents(final Iterator<String> lineIterator) {
return new Iterator<LogEvent>() {
@Override
public boolean hasNext() {
return lineIterator.hasNext();
}
@Override
public LogEvent next() {
final LogEvent.Builder builder = LogEvent.builder();
String line;
while(lineIterator.hasNext() && !(line = lineIterator.next()).isEmpty()) {
builder.appendLine(line);
}
return builder.build();
}
};
}
现在您可以编写一个方法:
Stream<LogEvent> toLogEvents(final Supplier<Stream<String>> fileReader) {
final Stream<String> lines = fileReader.get();
final Iterator<LogEvent> logEventIterator = toLogEvents(lines.iterator());
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(logEventIterator, Spliterator.ORDERED), false).onClose(() -> lines.close());
}
关于java - 将多行日志文件分解为事件流或迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49709781/