How do I close an enumerated file?

Let's say in action I have:

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)

      

How do I close readers / streams?

+3


source to share


2 answers


There is a callback onDoneEnumerating

that works like finally

(will always be called if it fails Enumerator

). You can close streams there.



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).onDoneEnumerating {
        is.close()
        // ... Anything else you want to execute when the Enumerator finishes.
    }
}

      

+3


source


The I / O tools provided Enumerator

give you this kind of resource management out of the box. if you create an enumerator with fromStream

, the stream is guaranteed to be closed upon startup (even if you are only reading one line, etc.).

So, for example, you could write the following:



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)

      

It's a shame that the library doesn't provide linesFromStream

out of the box, but I personally would rather use fromStream

with manual splitting, etc., using an iterator and providing my own resource control.

+2


source







All Articles