我正在尝试创建一个处理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
);
这可能吗?
答案 0 :(得分:0)
我建议使用Flow.flatMapConcat
。首先,你必须编写一个Source,它将从一个文件生成行,然后flatMapConcat这些Sources在一起。使用Framing还有一些ByteString解析,我从docs得到了:
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()));