在删除之前是否需要发布Scala文件?

时间:2011-12-23 03:43:29

标签: scala

在下面的代码中,如果我取消注释for循环,文件将不再被删除

val file = "myfile.csv"
//for (line <- Source.fromFile(file).getLines()) { }
new File(file).delete()

如果有,我应该调用某种类型的关闭函数?

3 个答案:

答案 0 :(得分:4)

您应该致电某种关闭:

val file = "myfile.csv"
val source = Source.fromFile(file)
for (line <- source.getLines()) { }
source.close
new File(file).delete

但这有点乏味。如果您将for循环重写为

source.getLines().foreach{ line => }

然后你可以

class CloseAfter[A <: { def close(): Unit }](a: A) {
  def closed[B](f: A => B) = try { f(a) } finally { a.close }
}
implicit def close_things[A <: { def close(): Unit }](a: A) = new CloseAfter(a)

现在您的代码将变为

val file = "myfile.csv"
Source.fromFile(file).closed(_.foreach{ line => })
new File(file).delete

(如果您在代码中多次执行此操作,或者如果您已经维护了自己的有用函数库,那么这将是一个好处,并且很容易将隐藏的关闭添加到那里,以便您可以使用它到处)。

答案 1 :(得分:3)

正如其他人所说,是的,当你完成它时,你需要关闭Source。另一个好的解决方案是使用scala-arm为您自动关闭文件。

import resource._

val file = "myfile.csv"
for {
  source <- managed(Source.fromFile(file))
  line <- source.getLines()
} {
}
new File(file).delete

答案 2 :(得分:2)

阅读“Why doesn't Scala Source close the underlying InputStream?”后,请改为使用“scala-incubator / scala-io”。

它包含一个delete operation a Path来处理所有事情。该库始终确保在每次使用后安全地关闭文件。