2015-01-01 10 views
6

Sto usando scala 2.10 e mi chiedo se ci sia qualche pacchetto con IO asincrono quando si lavora con i file?Lo scala offre IO asincroni non bloccanti quando si lavora con i file?

ho fatto qualche ricerca o questo argomento, ma per lo più trovato esempi seguenti

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

ciò essenzialmente pacchetto essenzialmente java.io con il blocco operazioni di IO - scrivere, leggere, ecc ho trovato anche scala-io progetto con questa intenzione, ma sembra che il progetto sia morto l'ultima attività 2012.

Qual è la migliore pratica in questo scenario? Esiste un pacchetto scala o il modo comune è il wrapping del codice java.io su Futures and Observables?

Il mio caso d'uso proviene da un attore Akka necessario per manipolare i file sul file system locale o remoto. È necessario evitare il blocco. O c'è un'alternativa migliore?

Thnaks per clarifing questo

+0

Stai già utilizzando Akka - invia un messaggio. –

+0

Scusa probabilmente non l'ho capito. Dal corpo di risposta di un attore ho bisogno di scrivere su un file. Sto cercando di evitare di bloccare su bw.write – jaksky

+2

Sì, invia un messaggio e fai fare un altro attore. –

risposta

5

Scala non offre API esplicita per il file asincrona IO, tuttavia l'API Java pianura è esattamente la cosa giusta da utilizzare in quei casi (questo è in realtà una buona cosa, siamo in grado di utilizzare tutte queste belle API senza qualsiasi involucro!). Si dovrebbe esaminare usando java.nio.channels.AsynchronousFileChannel, che è disponibile da JDK7 e fa uso delle chiamate async di sistema sottostanti per il file IO.

Akka IO, pur non fornendo IO file nel suo centro, ha un modulo sviluppato da Dario Rexin, che permette di utilizzare AsynchronousFileChannel con Akka IO in maniera molto semplice. Date un'occhiata a questa libreria per fare uso di esso: https://github.com/drexin/akka-io-file

In prossimo futuro Akka fornirà File IO nel suo modulo akka-streams. Potrebbe essere come una libreria esterna per un po ', tuttavia, non siamo ancora sicuri di dove mettere questo dato che richiederà agli utenti di avere almeno JDK 7, mentre la maggior parte di Akka attualmente supporta JDK6. Detto questo, i flussi basati su file asincroni con retro-pressione IO arriveranno presto :-)

3

Se stai usando scalaz-stream per il vostro sostegno async ha file functionality che è costruito sulle API asincroni java.nio - questo è probabilmente l'approccio mi consiglia. Se stai usando standard scala futures probabilmente puoi usare akka-io? quale I penso che usi Netty come back-end. Oppure puoi chiamare direttamente NIO - bastano un paio di righe per adattare un'API callback a scalaz o scala futures.

+1

Correggimi se ho torto, ma la mia comprensione era che akka-io attualmente supporta solo TCP e UDP – jaksky

+0

Oh forse. L'approccio scalaz-stream è quello che uso io stesso, akka-io era solo qualcosa di cui avevo sentito parlare dagli altri. – lmm

+1

Mentre Akka IO non implementa direttamente il file IO, è possibile utilizzare il modulo [akka-io-file] (https://github.com/drexin/akka-io-file) di Dario Rexin per estendere Akka IO per essere in grado di lavorare con AsynchronousFileChannel da java.nio. :-) –

Problemi correlati