比如说,在我的行动中:
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)如何关闭阅读器/流?
发布于 2014-11-15 15:13:19
有一个onDoneEnumerating回调函数,如finally (无论Enumerator是否失败,都会被调用)。你可以关闭那里的溪流。
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.
}
}发布于 2014-11-15 15:46:57
Enumerator提供的IO工具为您提供了这种资源管理,例如,如果您使用fromStream创建枚举器,则保证流在运行后会关闭(即使您只读取一行,等等)。
因此,例如,您可以编写以下内容:
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。
https://stackoverflow.com/questions/26947011
复制相似问题