2015-10-19 10 views
5

In Java, quando si chiama AsynchronousFileChannel.write(...) si riceve uno Future, che può quindi essere completato per il completamento tramite Future.get().Quando un AsynchronousFileChannel scrive "completo"?

Quando la chiamata get() restituisce, la scrittura è stata scritta sul disco o solo nella cache della pagina?

Se è importante, la piattaforma specifica di cui sono curioso è Linux & ext4.

risposta

1

Partenza questa documentazione:

https://docs.oracle.com/javase/7/docs/api/java/nio/channels/AsynchronousFileChannel.html#force(boolean)

Sembra che, anche dopo che il metodo get rendimenti sul Future, c'è qualche qualche cache a livello di sistema operativo che potrebbe impedire che il contenuto viene scritto sul disco . Se vuoi essere veramente sicuro, penso che devi fare un force dopo i ritorni Future.

Un estratto rilevanti:

Forze eventuali aggiornamenti del file di questo canale da scrivere alla memorizzazione dispositivo che lo contiene. Se il file di questo canale si trova su un dispositivo di memorizzazione locale , quando questo metodo viene restituito, è garantito che tutte le modifiche apportate al file da quando questo canale è stato creato, o poiché questo metodo è stato richiamato l'ultima volta, sarà stato scritto su tale dispositivo. Questo è utile per garantire che le informazioni critiche non vengano perse nell'evento di un arresto anomalo del sistema.

Se il file non risiede su un dispositivo locale, non viene fornita tale garanzia .

Il parametro metaData può essere utilizzato per limitare il numero di operazioni di I/O che questo metodo è necessario per eseguire. Passando false per questo parametro indica che solo gli aggiornamenti del contenuto del file devono essere scritti nello storage ; passando true indica che gli aggiornamenti per entrambi i contenuti e i metadati del file devono essere scritti, che in genere richiede almeno un'altra operazione di I/O. Se questo parametro ha effettivamente un effetto dipende dal sistema operativo sottostante ed è quindi quindi non specificato.

Se si richiama questo metodo, è possibile che si verifichi un'operazione di I/O anche se il canale è stato aperto solo per la lettura. Alcuni sistemi operativi, per esempio , mantengono un ultimo accesso come parte dei metadati di un file e questa volta viene aggiornato ogni volta che il file viene letto. Indipendentemente dal fatto che questo sia effettivamente eseguito dipende dal sistema e pertanto non è specificato.

Questo metodo è garantito solo per forzare le modifiche apportate a questo file del canale tramite i metodi definiti in questa classe.

Problemi correlati