、私は、ファイルがもはや 削除する前にScalaファイルを公開する必要がありますか?以下のコードで
val file = "myfile.csv"
//for (line <- Source.fromFile(file).getLines()) { }
new File(file).delete()
を削除されるループのためにもしそうなら、私は呼び出すべきであるクローズ機能のいくつかの種類があるコメントを解除した場合?
、私は、ファイルがもはや 削除する前に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
が、これは少し面倒ですが。あなたは
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
あなたはどのプラットフォームにいますか? –
Windows 7 64ビット – deltanovember
Windowsはファイルを開くときにファイルをロックし、削除などの他の操作を防止します。あなたは正しいです、あなたは明示的にファイルを閉じる必要があります。 –