我有一个处理大文件的图形。通过从输入流创建的迭代器访问文件。
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
时这样做?
答案 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)
}