加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – 迭代器在目录中的文件中的所有行

发布时间:2020-12-16 09:21:14 所属栏目:安全 来源:网络整理
导读:我真的很喜欢 for (line - Source fromFile inputPath getLines) {doSomething line} 在scala中迭代文件的构造,我想知道是否有一种方法可以使用类似的结构来遍历目录中所有文件的行. 这里的一个重要限制是所有文件加起来会产生堆溢出的空间. (认为??几十GB,
我真的很喜欢

for (line <- Source fromFile inputPath getLines) {doSomething line}

在scala中迭代文件的构造,我想知道是否有一种方法可以使用类似的结构来遍历目录中所有文件的行.

这里的一个重要限制是所有文件加起来会产生堆溢出的空间. (认为??几十GB,所以增加堆大小不是一个选择)作为现在的工作,我一直在一起进入一个文件,并使用上述的工作b / c懒惰的构造.

点,这似乎引起了一些问题,我可以连接两(百)个懒惰的迭代器,并得到一个非常大的,非常懒惰的?

解决方法

是的,虽然不太简洁:

import java.io.File
import scala.io.Source

for {
  file <- new File(dir).listFiles.toIterator if file.isFile
  line <- Source fromFile file getLines
} { doSomething line }

诀窍是flatMap和its for-comprehension syntactic sugar.例如,上面的或多或少等同于以下内容:

new File(dir)
  .listFiles.toIterator
  .filter(_.isFile)
  .flatMap(Source fromFile _ getLines)
  .map(doSomething)

正如Daniel Sobral在下面的评论中指出的,这种方法(和你的问题中的代码)将使文件保持打开状态.如果这是一次性脚本,或者您只是在REPL中工作,这可能不是一件大事.如果遇到问题,可以使用pimp-my-library pattern实现一些基本的资源管理:

implicit def toClosingSource(source: Source) = new {
  val lines = source.getLines
  var stillOpen = true
  def getLinesAndClose = new Iterator[String] {
    def hasNext = stillOpen && lines.hasNext
    def next = {
      val line = lines.next
      if (!lines.hasNext) { source.close() ; stillOpen = false }
      line
    }
  }
}

现在只需使用Source fromFile文件getLinesAndClose,您就不必担心文件被打开.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读