El artículo de Tim Bray "Saving Data Safely" me dejó con preguntas abiertas. Hoy, tengo más de un mes y no he visto ningún seguimiento al respecto, así que decidí abordar el tema aquí.ext4/fsync situación poco clara en Android (Java)
Un punto del artículo es que se debe llamar a FileDescriptor.sync() para estar seguro cuando se utiliza FileOutputStream. Al principio, estaba muy irritado porque nunca había visto ningún código Java sincronizado durante los 12 años que tengo Java. Especialmente porque lidiar con archivos es algo bastante básico. Además, el JavaDoc estándar de FileOutputStream nunca insinuó la sincronización (Java 1.0 - 6). Después de algunas investigaciones, calculé que ext4 podría ser el primer sistema de archivos convencional que requiera sincronización. (¿Hay otros sistemas de archivos en el que se recomienda la sincronización explícita?)
aprecio algunas ideas generales sobre la materia, pero también tengo algunas preguntas específicas:
- Cuando se androide hacer la sincronización con el sistema de archivos ? Esto podría ser periódico y adicionalmente basarse en eventos del ciclo de vida (por ejemplo, el proceso de una aplicación pasa al segundo plano).
- ¿FileDescriptor.sync() se encarga de sincronizar los metadatos? Eso es sincronizar el directorio del archivo cambiado. Compare con FileChannel.force().
- Normalmente, uno no escribe directamente en FileOutputStream. Aquí está mi solución (¿estás de acuerdo?):
FileOutputStream fileOut = ctx.openFileOutput(file, Context.MODE_PRIVATE); BufferedOutputStream out = new BufferedOutputStream(fileOut); try { out.write(something); out.flush(); fileOut.getFD().sync(); } finally { out.close(); }
Hubiera esperado que flush() se asegurara de que todo estuviera escrito en el disco, esencialmente llamando a sync(). ¿No es ese el caso? –
@a_horse_with_no_name: No, no lo es. _flush_ y _sync_ son dos operaciones diferentes: flush solo vacía búferes intermedios; sincronización realmente escribe en el almacenamiento. Ver p. http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync – sleske
@sleske: gracias por la aclaración! –