首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭枚举文件?

如何关闭枚举文件?
EN

Stack Overflow用户
提问于 2014-11-15 14:46:26
回答 2查看 213关注 0票数 3

比如说,在我的行动中:

代码语言:javascript
复制
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)

如何关闭阅读器/流?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-15 15:13:19

有一个onDoneEnumerating回调函数,如finally (无论Enumerator是否失败,都会被调用)。你可以关闭那里的溪流。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-11-15 15:46:57

Enumerator提供的IO工具为您提供了这种资源管理,例如,如果您使用fromStream创建枚举器,则保证流在运行后会关闭(即使您只读取一行,等等)。

因此,例如,您可以编写以下内容:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26947011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档