在下面的代碼,如果我去掉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