我有一个:
val fileStream: Source[ByteString, Any] = Source.single(ByteString.fromString("Hello"))此Source[ByteString, Any]类型来自akka fileUpload指令:
我是否可以将其转换为Source[ByteString, IOResult],或者执行类似于Source.single(ByteString.fromString("Hello"))的其他操作,从字符串中返回Source[ByteString, IOResult]?
我可以使用以下方法创建IO结果:
val ioResult: IOResult = IOResult.createSuccessful(1L)和一个ByteString,包括:
val byteString: ByteString = ByteString.fromString("Hello")所以现在我只需要他们作为一个Source[ByteString, IOResult]
注意,这只是一个单元测试,我正在测试一个返回Source[ByteString, IOResult]的函数,所以我想创建这个函数的一个实例(不需要创建一个文件)来断言函数返回正确的ByteString,我并不真正关心Source的IOResult部分。
发布于 2018-08-30 13:24:30
专用于fileUpload指令
我怀疑fileUpload编写器将物化类型保留为Any,以便允许将来对API进行更改。通过将其保留为Any,他们以后可以将其更改为他们真正想要解决的类型。
因此,即使您能够转换到IOResult,如果您升级了akka版本,并且类型发生了更改,您可能会遇到一些问题。
物化一般
Source类型参数中的第二个类型指示流将“物化”到什么中。使用示例代码并将Any修改为NotUsed,我们可以显示流的整个生命周期:
val notUsed : NotUsed = Source.single(ByteString.fromString("Hello"))
.toMat(Sink.ignore)(Keep.left)
.run()如您所见,当流运行时,它将被转换为一个实际值(即物化)。在上面的例子中,值的类型是NotUsed。这是因为您无法对单个值的流执行太多操作。
将该流与对文件进行操作的流。进行对比
val file = Paths.get("example.csv")
val fileIOResult: Future[IOResult] = FileIO.fromPath(file)
.to(Sink.ignore)
.run()在本例中,流正在读取文件的内容并将其流到Sink。在这里,了解文件读取中是否有任何错误是有用的。为了能够了解文件读取进行得有多顺利,流被物化成一个Future[IOResult],您可以使用它获取有关文件读取的信息:
fileIOResult foreach { ioResult =>
println(s"read ${ioResult.count} bytes from file")
}因此,将Any“转换”为IOResult是没有意义的.
https://stackoverflow.com/questions/52096078
复制相似问题