3

私が持っているアクションで言ってください:

val linesEnu = {
    val is = new java.io.FileInputStream(path)
    val isr = new java.io.InputStreamReader(is, "UTF-8")
    val br = new java.io.BufferedReader(isr)
    import scala.collection.JavaConversions._
    val rows: scala.collection.Iterator[String] = br.lines.iterator
    Enumerator.enumerate(rows)
}

Ok.feed(linesEnu).as(HTML)

リーダー/ストリームを閉じるには?

4

2 に答える 2

2

が提供する IO ツールは、Enumeratorこの種のリソース管理をすぐに利用できるようにします。たとえば、 を使用して列挙子を作成するとfromStream、実行後にストリームが閉じられることが保証されます (1 行しか読み取らない場合などでも)。

たとえば、次のように記述できます。

import play.api.libs.iteratee._

val splitByNl = Enumeratee.grouped(
  Traversable.splitOnceAt[Array[Byte], Byte](_ != '\n'.toByte) &>>
  Iteratee.consume()
) compose Enumeratee.map(new String(_, "UTF-8"))

def fileLines(path: String): Enumerator[String] =
  Enumerator.fromStream(new java.io.FileInputStream(path)).through(splitByNl)

ライブラリがすぐに使用できるものを提供していないのは残念ですが、個人的には、イテレータを使用して独自のリソース管理を提供するよりも、手動分割などで使用することをlinesFromStream好みます。fromStream

于 2014-11-15T15:46:57.050 に答える