2015-01-01 9 views
6

私はscala 2.10を使用していますが、ファイルで作業するときに非同期IOを持つパッケージがあるのでしょうか?スカラーはファイルを扱う際に非同期非ブロックIOを提供しますか?

私はこのトピックOいくつかの検索をしましたが、ほとんど基本的にどのようなIO操作をブロックすると本質的にjava.ioパッケージ

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

次のように例を見つけた - 私もこの意思とscala-ioプロジェクトを見つけ、読み取り、書き込みなどが、プロジェクトが最後の最後の活動であると思われます2012。

このシナリオではどのようなベストプラクティスですか?任意のスカラパッケージがありますか、または一般的な方法でjava.ioコードをFutures and Observablesにラッピングしていますか?

私の使用例は、Akkaアクタからのもので、ローカルまたはリモートのファイルシステム上のファイルを操作する必要があります。ブロックする必要はありません。それとももっと良い選択肢がありますか?

Thnaksあなたは非同期サポートのためscalazストリームを使用している場合、この

+0

あなたはすでにAkkaを使用しています - メッセージを送信してください。 –

+0

申し訳ありませんが、おそらく私はそれを得ていませんでした。俳優のレスポンス本文の中から、私はファイルに書き込む必要があります。私はbw.writeをブロックすることを避けようとしています。 – jaksky

+2

はい、メッセージを送信して、別の俳優にそれをさせてください。 –

答えて

5

Scalaのは、非同期ファイルIOの明示的なAPIを提供していない、しかしプレーンJava APIは、(これは実際には良いことである場合に使用するために正確に正しいことで、我々はせずに、これらすべての素敵なAPIを使用することができます任意のラッピング!)。あなたは、java.nio.channels.AsynchronousFileChannelを調べるべきです。これは、JDK7以降で利用可能で、ファイルIOの基礎となるシステム非同期呼び出しを利用しています。アッカIO

、それはコアの中のファイルIOを提供していない間は、非常に簡単な方法でアッカIOとAsynchronousFileChannelを使用することができますダリオRexin、によって開発されたモジュールがあります。アッカは、そのakka-streamsモジュール内のファイルIOを提供します近い将来https://github.com/drexin/akka-io-file

:それを利用するために、このライブラリを見ています。しかし、外部ライブラリとしての可能性はありますが、Akkaのほとんどが現在JDK6をサポートしているのに対し、ユーザーは少なくとも7人のJDKを必要とするため、どこに置くべきかはわかりません。これがあると、ストリームベースの非同期バックプレッシャーファイルIOがすぐに来ます:-)

3

をclarifingことがjava.nio非同期APIの上に構築されていますfile functionalityを持っている - それはおそらく私がお勧めのアプローチです。標準的なスカラ先物を使用している場合は、おそらくakka-ioを使用できますか?私はと思っています。はNettyをバックエンドとして使用しています。あるいは、NIOを直接呼び出すこともできます。コールバックベースのAPIをscalazまたはscalaの先物に適用するには、数行しかかかりません。

+1

間違っていますが、私の理解ではakka-ioは現在TCPとUDPだけをサポートしています – jaksky

+0

ああ。スカラズ・ストリームのアプローチは私が自分自身を使っているアプローチです、akka-ioは他の人から聞いたことでした。 – lmm

+1

Akka IOはファイルIOを直接的に実装していませんが、Dario Rexinの[akka-io-file](https://github.com/drexin/akka-io-file)モジュールを使用してAkka IOを拡張することができますjava.nioからAsynchronousFileChannelを操作します。 :-) –

関連する問題