2010-11-01 4 views
31

Mi sono imbattuto in questi due termini e la mia comprensione di essi sembra sovrapporsi l'uno con l'altro. Flush viene utilizzato con i buffer e la sincronizzazione viene utilizzata per parlare delle modifiche persistenti dei file su disco.I/O concetto flush vs sync

In C, fflush (stdin) si assicura che il buffer sia deselezionato. E fsync per persistere cambia il file su disco.

Se questi concetti non sono universalmente definiti, preferirebbe un Linux, Java spiegazione.

Ho trovato un post correlato, ma ir in realtà non risponde alla mia domanda. Really force file sync/flush in Java

+0

In particolare, mi sono imbattuto in questo libro relativo a Java che dice "assicurati di svuotare e sincronizzare". cosa comporta ognuno di questi passaggi? Vorrei una risposta che distingua entrambi e anche uno scenario in cui entrambi sono coinvolti. – smartnut007

risposta

57

In Java, il metodo flush() viene utilizzato nei flussi di output e nei writer per garantire che i dati memorizzati nel buffer vengano scritti. Tuttavia, secondo il Javadocs:

Se la destinazione prevista di questo flusso è un'astrazione fornito dal sistema operativo sottostante, ad esempio un file, quindi lavaggio garanzie flusso solo byte precedentemente scritto nel flusso vengono passati al sistema operativo per scrivere; non garantisce che vengano effettivamente scritti su un dispositivo fisico come un'unità disco.

D'altra parte, è possibile utilizzare FileDescriptor.sync() per garantire che i dati memorizzati dal sistema operativo vengano scritti sul dispositivo fisico (disco). È la stessa della chiamata sync in Linux/POSIX.

Se la vostra applicazione Java ha davvero bisogno di assicurare che i dati sono fisicamente scritto su disco, potrebbe essere necessario flush e sync, ad esempio:

FileOutputStream out = new FileOutputStream(filename); 

[...] 

out.flush(); 
out.getFD().sync(); 

Riferimenti:

+11

Se posso riesaminare questo in modo grossolano. Quindi, svuota il buffer jvm e lo trasferisce nel buffer del sistema operativo. E la sincronizzazione assicura che il sistema operativo persista effettivamente il contenuto in file. ha senso? – smartnut007

+0

Esattamente. Questo è esattamente come funziona. – Grodriguez

+0

flush dice "write out buffers". Sono come scrivere dove? scrivere suoni anche a persistere per me. Quindi, confuso. – smartnut007