Закрытие InputStream в графе - PullRequest
0 голосов
/ 01 июля 2018

У меня есть график, который обрабатывает большой файл. Доступ к файлу осуществляется через итератор, созданный из входного потока.

for {
  in <- managed(new FileInputStream(inputFile))
} {
  // 3rd party lib that creates iterator from input stream
  val iterator = () => EntityIterator.fromPbf(in) 
  Source
    .fromIterator[OSMEntity](iterator)
    .runForeach(println)
}

(Здесь я использую ARM, но я рад, что мне нужно вручную управлять потоком ввода).

Я ожидаю, что этот код напечатает каждый объект в итераторе. Вместо этого он сразу заканчивается, потому что in закрывается, как только закрывается блок ARM. Поскольку runForeach не блокируется, он немедленно закрывается.

Если я не использую ARM, когда мне нужно вручную закрывать поток ввода? Или мне не нужно, потому что Акка сделает это, когда будет достигнут EOF

1 Ответ

0 голосов
/ 02 июля 2018

Я не использовал scala-arm, но помните, что runForeach возвращает Future[Done]. Вы можете обращаться с чистой onComplete.

val buf = scala.io.Source.fromFile("readme.md")
Source.fromIterator(() => buf)
  .runForeach(print)
  .onComplete {
    case Success(_) => buf.close()
    case Failure(err) => println(s"error! ${err.getMessage}")
  }

Вы должны также рассмотреть FileIO Акки!

FileIO.fromPath(Paths.get("readme.md"))
  .map(_.utf8String)
  .runForeach(print)
  .onComplete {
    case Success(res) => println("done!")
    case Failure(err) => println(err.getMessage)
  }
...