有没有办法使用Akka流将Path元素流展平为内容行流?

时间:2015-05-17 17:44:13

标签: stream akka akka-stream

我正在尝试创建一个处理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
    );

这可能吗?

1 个答案:

答案 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()));