Stream 有没有办法用Akka流将路径元素流展平为内容行流?

Stream 有没有办法用Akka流将路径元素流展平为内容行流?,stream,akka,akka-stream,Stream,Akka,Akka Stream,我试图创建一个处理路径元素的javadsl流。它应该发出与Path元素关联的文件内容行。 换句话说,我认为我需要将路径元素流展平为字符串元素流 流确实有一种方法,但它涉及使用,我不确定如何在我的案例中使用它 final Flow<Path, String, BoxedUnit> toFileLines = Flow .<Path>create() .flatten(FlattenStrategy. toFileLines的最终流量=流量 .create(

我试图创建一个处理路径元素的javadsl流。它应该发出与Path元素关联的文件内容行。 换句话说,我认为我需要将路径元素流展平为字符串元素流

流确实有一种方法,但它涉及使用,我不确定如何在我的案例中使用它

final Flow<Path, String, BoxedUnit> toFileLines = Flow
    .<Path>create()
    .flatten(FlattenStrategy.
toFileLines的最终流量=流量
.create()
.扁平化(扁平化)策略。
非常感谢您的帮助

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

final Flow<Path, String, BoxedUnit> toFileLines = Flow
    .<Path>create()
    .mapAsync(
            //create streamreader
            //while streamreader has.next
                //read line until \n
                //emit line
    );
toFileLines的最终流量=流量
.create()
.mapAsync(
//创建streamreader
//而streamreader拥有.next
//读取行直到\n
//发射线
);

这可能吗?

我建议使用
Flow.flatMapConcat
。首先,您必须编写一个源代码,从文件中生成行,然后flatMapConcat将这些源代码放在一起。还有一点是使用Framing进行ByteString解析的,我从:

导入java.io.File;
导入akka.stream.javadsl.FileIO;
导入akka.stream.javadsl.Flow;
导入akka.stream.io.Framing;
导入akka.util.ByteString;
int maxLineSize=1024;
final ByteString delim=ByteString.fromString(“\r\n”);
最终流路径stocontents=
Flow.of(String.class)
.flatMapConcat(路径->文件IO.fromFile(新文件(路径))
.via(帧分隔符(delim、maxLineSize、true))
.map(byteStr->byteStr.utf8String());

试着将其视为一个多步骤过程:0。)您将获得一个路径流作为输入1。)流式处理每个文件的内容2。)将每个文件拆分为行3。)连接所有文件中的所有行。扁平化策略将仅用于最后一步。它指定如何“展平”来自传入源的内容,即它们是否应该连接或合并(尚未实现)。@jrudolph感谢您的回复。我对你总结的第一步和第二步很感兴趣。我应该如何以整洁且最好是并行的方式流式传输文件的内容(字符串行)?这些文件可以达到很大的大小,我想用惰性的方式读取它们,而不是一次读取整个文件。可以使用的Java8 streams实现吗?例如,您可以使用
SynchronousFileSource
。2.)即将推出的RC4将更加容易,其中将包括用于拆分字符串流的组件:
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()));