Нужно ли освобождать файлы Scala перед удалением? - PullRequest
3 голосов
/ 23 декабря 2011

В приведенном ниже коде, если я раскомментирую цикл for, файл больше не будет удален

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

Если это так, существует ли какой-либо тип функции закрытия, которую я должен вызывать?

Ответы [ 3 ]

4 голосов
/ 23 декабря 2011

Есть какая-то близость, которую вы должны звонить:

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 голосов
/ 23 декабря 2011

Как уже говорили другие, да, вам нужно закрыть Source, когда вы закончите с ним. Другим хорошим решением является использование scala-arm для автоматического закрытия файла для вас.

import resource._

val file = "myfile.csv"
for {
  source <- managed(Source.fromFile(file))
  line <- source.getLines()
} {
}
new File(file).delete
2 голосов
/ 23 декабря 2011

После прочтения " Почему Scala Source close базового InputStream? " использовать вместо " scala-инкубатор / scala-io ".

Включает в себя операцию удаления на a Path, которая обо всем позаботится.Эта библиотека всегда обеспечивает безопасное закрытие файлов после каждого использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...