我有一个场景,我想将图表的结果写入CSV。 这包括文件的创建,文件编写器的初始化(I'm using this library),最后,在流完成后,我想再次处理/关闭编写器。
理想情况下,我想将此逻辑封装在接收器中,但我想知道添加初始化和处理逻辑的最佳实践/挂钩。
答案 0 :(得分:2)
要使用Akka Streams将CSV内容写入文件,请使用Alpakka's CSV connector和FileIO
实用程序。这是一个简单的例子:
val destinationPath: Path = ???
Source.single(ByteString("""header1,header2,header3
|1,2,3
|4,5,6""".stripMargin))
.via(CsvParsing.lineScanner())
.runWith(FileIO.toPath(destinationPath))
请注意,FileIO.toPath
可选择OpenOption
次设置。例如,您可以规定目标文件的创建(如果它尚不存在):
// ...
.runWith(
FileIO.toPath(destinationPath, Set(StandardOpenOption.WRITE, StandardOpenOption.CREATE)))
至于清理与文件相关的底层资源,如果你使用FileIO
,Akka Streams将在流完成时采用它。
答案 1 :(得分:2)
给定任何类型的资源,而不仅仅是文件,消耗数据元素以及needs to be closed:
type Data = ???
trait DataConsumer extends Function1[Data, Unit] with AutoCloseable
可以创建一个Sink
,使用Flow
def createDataConsumerSink(dataConsumer: DataConsumer) : Sink[Data,_] =
Flow[Data].watchTermination()( (_, f) => f foreach (_ => dataConsumer.close()))
.to(Sink.foreach[Data](dataConsumer.apply))
<div *ngFor="item of listofitems">
<span [ngClass]="{'turnedon': 'localvariable == 'SELECTOR_{{item.name}}'}">item.name</span>
</div>
方法完成后关闭消费者,该方法可以预先添加:
'SELECTOR_{{item.name}}