0

我正在尝试创建一个处理 Path 元素的 javadsl Flow。它应该发出与 Path 元素关联的文件的内容行。换句话说,我认为我需要将 Path 元素流展平为 String 元素流。

Flow 确实有一个flatten方法,但它涉及使用FlattenStrategy,我不确定如何在我的案例中使用它。

final Flow<Path, String, BoxedUnit> toFileLines = Flow
    .<Path>create()
    .flatten(FlattenStrategy.

任何帮助是极大的赞赏!

Edit1:所以我的理解是,使用 StreamReader 读取文件并在阅读器到达“\n”时发出一个新字符串可能是个好主意。所以现在的问题是如何从一个单一的转换方法发出多个元素。像这样

final Flow<Path, String, BoxedUnit> toFileLines = Flow
    .<Path>create()
    .mapAsync(
            //create streamreader
            //while streamreader has.next
                //read line until \n
                //emit line
    );

这可能吗?

4

1 回答 1

0

我建议使用Flow.flatMapConcat. 首先,您必须编写一个从文件中生成行的 Source,然后将这些 Sources flatMapConcat 在一起。我从文档中获得了一些使用框架的 ByteString 解析:

import java.io.File;
import akka.stream.javadsl.FileIO;
import akka.stream.javadsl.Flow;
import akka.stream.io.Framing;
import akka.util.ByteString;

int maxLineSize = 1024;

final ByteString delim = ByteString.fromString("\r\n");

final Flow<String, String, BoxedUnit> pathsToContents = 
  Flow.of(String.class)
      .flatMapConcat(path -> FileIO.fromFile(new File(path))
                                   .via(Framing.delimiter(delim, maxLineSize,true))
                                   .map(byteStr -> byteStr.utf8String()));
于 2015-12-24T14:23:53.173 回答