2011-12-23 59 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 
相關問題