外部库使用java.io.Writer
接口进行某种输出,目前我使用StringWriter
缓冲所有输出,然后Ok(writer.toString)
。但是我想避免缓冲和流式传输Writer
提供的数据。
如何制作基于Enumerator
的游戏java.io.Writer
?
答案 0 :(得分:1)
您可以实现自己的编写器,它使用Concurrent.Channel将数据推送到枚举器,让我们谈谈代码:
class MyWriter extends java.io.Writer{
var channel : Concurent.Channel
def write(x:Array[Char], s:Int, e:Int) = {
channel.push(x)
}
def close() = {
channel.end()
}
def flush() = {
}
}
// every time writer.write is used it will push data to the enumeratr
var writer = new YourWriter();
val enumerator:Enumerator[Array[Char]] = Concurrent.unicast[Array[Char]](channel => {writer.channel = channel})
答案 1 :(得分:0)
在 faissalb 的帮助下,我得到了这个最终的工作片段(它是FreeMarker输出的流媒体,但可以在任何Writer
使用 - 当然是预期的情况):
class FltWriter(channel: Concurrent.Channel[Array[Byte]]) extends java.io.Writer {
def write(cs: Array[Char], start: Int, len: Int): Unit = channel.push(new String(cs, start, len).getBytes("UTF-8"))
def flush: Unit = channel.end
def close: Unit = channel.eofAndEnd
}
def e(tpl: String, data: Map[String, Any], config: Configuration = cfg)(implicit ec: ExecutionContext) =
Concurrent.unicast[Array[Byte]] { channel => config.getTemplate(tpl).process(data, new FltWriter(channel)) }
在使用flush
的情况下(即FreeMarker输出)是强制性的。
您看,channel
已移入Writer
构造函数,从而产生不可变代码。