2011-12-23 39 views
3

在下面的代码,如果我去掉for循环的文件不再被删除Scala文件在删除之前需要发布吗?

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

如果是的话是有一些类型接近的功能,我应该打电话?

+0

你在哪个平台上? – 2011-12-23 03:47:38

+0

Windows 7 64位 – deltanovember 2011-12-23 04:25:11

+4

Windows在打开文件时锁定文件,防止其他操作(如删除)。你是对的,你确实需要明确地关闭文件。 – 2011-12-23 04:48:32

回答

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 

(这将是一个好处,如果你做了很多代码中的次数,或者如果您已经维护了自己的有用函数库,并且只需在此处添加隐式关闭就很容易,因此您可以在任何地方使用它。

3

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

import resource._ 

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