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

标签 java java-stream

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

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/

相关文章:

C# 到 Java 的转换

java - 通过 Hibernate 存储和检索图像

java - 使用 Streams 将 3 个数组转换为 1 个对象数组

java - Mockito - 如何用自定义对象回答

java - PigServer 在本地文件系统上留下作业 jar

java - 将 map 列表转换为使用 ImmutablePair 和 Java 8 流的 map

java - 如何仅使用 reduce 在列表中找到最小值?

java - 使用 java 8 流式传输 2 循环并从内循环返回外循环对象

java - 使用 Java 8 按属性对自定义对象列表进行分组

java - 使用 Cloud Firestore 向其他用户发送或接收的消息填充 Fragment