我正在试图弄清楚如何处理一个情况,在你的一个阶段你需要进行一个返回一个InputStream的调用,在那里我将处理该流作为进一步向下的阶段的源。
e.g。
Source.map(e => Calls that return an InputStream) .via(processingFlow).runwith(sink.ignore)
我希望将Processing流程中的元素作为来自InputStream的元素。这基本上是我正在拖尾文件,读取每一行,该行给我关于我需要针对CLI api进行的调用的信息,当进行该调用时,我将Stdout作为InputStream从中读取结果。结果大部分时间都是巨大的,所以我可以 只收集记忆中的所有东西。
中号
答案 0 :(得分:1)
StreamConverters
实用程序从java.io流中获取Source
和Sink
。更多信息here。flatMapConcat
或flatMapMerge
将Source
的流展平为单个流。更多信息here。一个简单的例子可能是:
val source: Source[String, NotUsed] = ???
def gimmeInputStream(name: String): InputStream = ???
val processingFlow: Flow[ByteString, ByteString, NotUsed] = ???
source
.map(gimmeInputStream)
.flatMapConcat(is ⇒ StreamConverters.fromInputStream(() ⇒ is, chunkSize = 8192))
.via(processingFlow)
.runWith(Sink.ignore)
然而,Akka Streams提供了更加惯用的DSL来读取/写入FileIO
对象中的文件。更多信息here。
示例变为:
val source: Source[String, NotUsed] = ???
val processingFlow: Flow[ByteString, ByteString, NotUsed] = ???
source
.flatMapConcat(name ⇒ FileIO.fromPath(Paths.get(name)))
.via(processingFlow)
.runWith(Sink.ignore)