【问题标题】:How to close enumerated file?如何关闭枚举文件?
【发布时间】:2015-01-12 20:22:44
【问题描述】:

说,我有一个动作:

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)

如何关闭阅读器/流?

【问题讨论】:

    标签: scala playframework-2.0 enumerator iterate


    【解决方案1】:

    有一个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.
        }
    }
    

    【讨论】:

      【解决方案2】:

      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 和手动拆分等,而不是使用迭代器并提供我自己的资源管理。

      【讨论】:

      • Travis,谢谢你的方式 - 我尝试了它,并使用大量过滤器和映射来增强它,这些过滤器和映射应用于我在真实代码中拥有的每个字符串。结果,与使用 java 迭代器的流相比,我的流慢了 ~2.5。您是否正在使用任何性能调整?
      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      相关资源
      最近更新 更多