gpt4 book ai didi

java - 将多行日志文件分解为事件流或迭代器

转载 作者:行者123 更新时间:2023-11-30 02:12:16 26 4
gpt4 key购买 nike

我有一个具有以下布局的日志文件

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com