播放框架:如何枚举java.io.Writer?

时间:2014-08-12 06:22:50

标签: scala playframework enumerator writer playframework-2.3

外部库使用java.io.Writer接口进行某种输出,目前我使用StringWriter缓冲所有输出,然后Ok(writer.toString)。但是我想避免缓冲和流式传输Writer提供的数据。

如何制作基于Enumerator的游戏java.io.Writer

2 个答案:

答案 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构造函数,从而产生不可变代码。