2009-07-02 14 views
2

J'utilise RandomAccessFile pour effectuer des écritures dans un fichier dans le cadre d'une transaction. Avant de valider ma transaction, je veux être absolument sûr que les données sont écrites sur le disque. Appeler le force(boolean) sur le FileChannel du RAF semble fournir cette garantie, mais est-ce que cela s'appelle implicitement quand je ferme le fichier, ou dois-je l'appeler manuellement?Est-ce que RandomAccessFile.close() appelle en interne FileChannel.force()?

En outre, quelqu'un a-t-il un aperçu de ce que fait effectivement force(), et jusqu'où peut-on faire confiance? Est-il possible que le système d'exploitation peut signaler que les données ont été écrites sur le disque, alors qu'en fait il est toujours dans un cache quelque part? Dans quelle mesure cet OS/HDD/système de fichiers est-il dépendant?

Répondre

0

Ceci est complètement dépendant de FS. Mais si vous n'obtenez pas d'exception (IO), vous devez faire confiance à la JVM et valider votre transaction. Si vous pouvez faire confiance à votre FS est l'autre question. Par exemple, si vous utilisez ext4 avec l'allocation différée activée, vous risquez de perdre des données sur une perte de puissance instantanée même après que RandomAccessFile # force (boolean) a été renvoyé avec succès. La JVM repose sur l'API FS de votre système d'exploitation et ne se soucie pas de l'implémentation et de la configuration réelles.

Et oui, vous devez appeler RandomAccessFile # force (boolean) avant de fermer. Que #close appelle #force est à la hauteur de l'implémentation de FileChannel.