L'articolo di Tim Bray "Saving Data Safely" mi ha lasciato con domande aperte. Oggi ha più di un mese di vita e non ho visto alcun follow-up, quindi ho deciso di affrontare l'argomento qui.situazione ext4/fsync non chiara in Android (Java)
Un punto dell'articolo è che FileDescriptor.sync() deve essere chiamato per essere al sicuro quando si utilizza FileOutputStream. All'inizio ero molto irritato, perché non ho mai visto alcun codice Java fare una sincronizzazione durante i 12 anni in cui lo faccio. Soprattutto dal momento che affrontare i file è una cosa piuttosto semplice. Inoltre, lo standard JavaDoc di FileOutputStream non ha mai accennato alla sincronizzazione (Java 1.0 - 6). Dopo alcune ricerche, ho capito che ext4 potrebbe essere effettivamente il primo file system mainstream che richiede la sincronizzazione. (Ci sono altri file system in cui è consigliato sincronizzazione esplicita?)
apprezzo alcune riflessioni generali in materia, ma ho anche alcune domande specifiche:
- Quando sarà Android fare la sincronizzazione al file system ? Questo potrebbe essere periodico e in aggiunta basato su eventi del ciclo di vita (ad esempio, il processo di un'app passa in secondo piano).
- FileDescriptor.sync() si occupa della sincronizzazione dei metadati? Questo è la sincronizzazione della directory del file modificato. Confronta con FileChannel.force().
- Di solito, uno non scrive direttamente in FileOutputStream. Ecco la mia soluzione (sei d'accordo?):
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(); }
Mi sarei aspettato che flush() assicurasse che tutto sia scritto sul disco - essenzialmente chiamando sync(). Non è così? –
@a_horse_with_no_name: No, non lo è. _flush_ e _sync_ sono due operazioni diverse: flush esegue il flush dei buffer intermedi; la sincronizzazione in realtà scrive nello spazio di archiviazione. Vedi per es. http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync – sleske
@sleske: grazie per il chiarimento! –