Conversión de concepto de E / S frente a sincronización

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.

En C, fflush (stdin) se asegura de que el buffer esté despejado. Y fsync para persistir cambia el archivo al disco.

Si estos conceptos no están universalmente definidos, preferiría una explicación de Linux y Java.

Encontré una publicación relacionada, pero realmente no responde mi pregunta. Realmente fuerza la sincronización / enjuague de archivos en Java

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

Si el destino previsto de esta secuencia es una abstracción proporcionada por el sistema operativo subyacente, por ejemplo, un archivo, el flujo de la stream garantiza únicamente que los bytes escritos previamente en la secuencia se pasan al sistema operativo para su escritura; 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 garantizar que los datos almacenados en búfer por el SO se escriban en el dispositivo físico (disco). Esto es lo mismo que la llamada de sync en Linux / POSIX.

Si su aplicación Java realmente necesita 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