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

时间:2015-01-01 21:23:44

标签: scala akka reactive-programming

我正在使用scala 2.10,我想知道在处理文件时是否有一些包含async IO的软件包?

我对这个主题进行了一些搜索,但大多数时候都会找到以下示例

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

本质上基本上是带有阻塞IO操作的java.io包 - 写,读等。我还发现scala-io项目有这个意图,但看起来这个项目已经死了2012年的最后一次活动。

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

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

向你澄清这个

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

如果您使用scalaz-stream进行异步支持,则file functionality基于java.nio异步API构建 - 这可能就是我推荐的方法。如果您使用的是标准scala期货,可以使用akka-io?我认为使用Netty作为后端。或者您可以直接调用NIO - 只需要几行就可以将基于回调的API调整为scalaz或scala期货。