在下面的代码,如果我去掉for循环的文件不再被删除Scala文件在删除之前需要发布吗?
val file = "myfile.csv"
//for (line <- Source.fromFile(file).getLines()) { }
new File(file).delete()
如果是的话是有一些类型接近的功能,我应该打电话?
在下面的代码,如果我去掉for循环的文件不再被删除Scala文件在删除之前需要发布吗?
val file = "myfile.csv"
//for (line <- Source.fromFile(file).getLines()) { }
new File(file).delete()
如果是的话是有一些类型接近的功能,我应该打电话?
有某种密切的,你应该叫:
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
(这将是一个好处,如果你做了很多代码中的次数,或者如果您已经维护了自己的有用函数库,并且只需在此处添加隐式关闭就很容易,因此您可以在任何地方使用它。
阅读“Why doesn't Scala Source close
the underlying InputStream
?”后,改用“scala-incubator/scala-io”。
它包括一个delete operation在a Path
它照顾的一切。该库始终确保文件在每次使用后安全关闭。
正如其他人所说,是的,当你完成它时,你需要关闭Source
。另一个好的解决方案是使用scala-arm为你自动关闭文件。
import resource._
val file = "myfile.csv"
for {
source <- managed(Source.fromFile(file))
line <- source.getLines()
} {
}
new File(file).delete
你在哪个平台上? – 2011-12-23 03:47:38
Windows 7 64位 – deltanovember 2011-12-23 04:25:11
Windows在打开文件时锁定文件,防止其他操作(如删除)。你是对的,你确实需要明确地关闭文件。 – 2011-12-23 04:48:32