scala 在处理文件时是否提供异步非阻塞 IO?

Does scala offer async non-blocking IO when working with files?

我正在使用 scala 2.10,我想知道是否有一些包在处理文件时具有异步 IO?

我对这个主题进行了一些搜索,但主要找到的示例如下

val file = new File(canonicalFilename)
val bw = new BufferedWriter(new FileWriter(file))
bw.write(text)
bw.close()

本质上 java.io 具有阻塞 IO 操作的程序包 - 写入、读取等。我还发现了 scala-io 具有此意图的项目,但似乎该项目已死于最后 activity 2012 .

这种情况下的最佳做法是什么?是否有任何 scala 包或常见的方法是将 java.io 代码包装到 Futures 和 Observables 中?

我的用例来自 Akka actor,需要操作本地或远程文件系统上的文件。需要避免阻塞。或者有更好的选择吗?

感谢澄清这一点

如果您使用 scalaz-stream 作为异步支持,它有 file functionality that's built on the java.nio async APIs - that's probably the approach I'd recommend. If you're using standard scala futures possibly you can use akka-io?我认为 使用 Netty 作为后端。或者你可以直接调用 NIO——只需要几行就可以使基于回调的 API 适应 scalaz 或 scala futures。

Scala 不为异步文件 IO 提供显式 API,然而 普通 Java API 在这些情况下使用完全正确(这实际上是一件好事,我们可以使用所有这些漂亮的 APIs 而无需任何包装!)。您应该考虑使用 java.nio.channels.AsynchronousFileChannel,它自 JDK7 起可用,并利用底层系统异步调用文件 IO。

Akka IO,虽然它的核心不提供文件 IO,但有一个由 Dario Rexin 开发的模块,它允许以非常简单的方式将 AsynchronousFileChannel 与 Akka IO 一起使用。查看此库以使用它:https://github.com/drexin/akka-io-file

不久的将来 Akka 将在其akka-streams 模块中提供文件IO。虽然它可能暂时作为一个外部库,但我们还不确定把它放在哪里,因为它要求用户至少有 JDK 7,而大多数 Akka 目前支持 JDK6。话虽如此,基于流的异步背压文件 IO 即将推出 :-)