2010-11-01 16 views
31

Me he encontrado con estos dos términos y mi comprensión de ellos parece superponerse entre sí. La descarga se usa con almacenamientos intermedios y la sincronización se usa para hablar sobre cambios persistentes de archivos en el disco.I/O concepto flush vs sync

En C, fflush (stdin) se asegura de que se borre el búfer. Y fsync para persistir cambia el archivo al disco.

Si estos conceptos no se definen universalmente, preferiría una explicación de Linux, Java.

Encontré una publicación relacionada, pero realmente no responde mi pregunta. Really force file sync/flush in Java

+0

En concreto, me encontré con este libro que se refiere a Java que dice: "asegúrese de enjuagar y sincronizar". ¿Qué implica cada uno de estos pasos? Me gustaría una respuesta que distinga ambos y también un escenario donde ambos estén involucrados. – smartnut007

Respuesta

57

En Java, el método flush() se utiliza en las secuencias de salida y los escritores para garantizar que los datos almacenados en el búfer se escriben. Sin embargo, de acuerdo con el Javadocs:

Si el destinatario de esta corriente es una abstracción que proporciona el sistema operativo subyacente, por ejemplo, un archivo, a continuación, lavado de las garantías corriente única que los bytes escritos con anterioridad a la corriente se transmiten al sistema operativo para escribir; no garantiza que estén escritos en un dispositivo físico, como una unidad de disco.

Por otro lado, FileDescriptor.sync() se puede utilizar para asegurar que los datos almacenados temporalmente por el sistema operativo se escribe en el dispositivo físico (disco). Es lo mismo que la llamada sync en Linux/POSIX.

Si la aplicación Java realmente necesita para asegurarse de que los datos se escriben físicamente en el disco, es posible que necesite flush y sync, por ejemplo:

FileOutputStream out = new FileOutputStream(filename); 

[...] 

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

Referencias:

+11

Si puedo repetir esto crudamente. Entonces, flush borra el buffer jvm y lo transfiere al buffer del sistema operativo. Y la sincronización asegura que el sistema operativo realmente persista en el contenido del archivo. ¿Eso tiene sentido? – smartnut007

+0

Exactamente. Así es exactamente como funciona. – Grodriguez

+0

flush dice "escribir buffers". Soy como escribir donde? escribir sonidos para persistir a mí. Por lo tanto, confuso. – smartnut007