图运行时InputStream关闭

时间:2018-06-30 23:41:54

标签: akka akka-stream

我有一个处理大文件的图形。通过从输入流创建的迭代器访问文件。

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,什么时候应该手动关闭输入流?还是我不需要因为Akka会在到达EOF时这样做?

1 个答案:

答案 0 :(得分:0)

我没有使用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}")
  }

您还应该考虑Akka的FileIO

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