ext4/fsync 在 Android (Java) 中的情况不明朗
Tim Bray的文章“安全地保存数据”给我留下了悬而未决的问题。今天,它已经一个多月了,我还没有看到任何后续工作,所以我决定在这里讨论这个话题。
本文的一点是,在使用 FileOutputStream 时,应调用 FileDescriptor.sync() 以确保安全。起初,我非常生气,因为在我做Java的12年里,我从未见过任何Java代码进行同步。特别是因为处理文件是一件非常基本的事情。此外,FileOutputStream的标准JavaDoc从未暗示过同步(Java 1.0 - 6)。经过一些研究,我认为 ext4 实际上可能是第一个需要同步的主流文件系统。(是否还有其他文件系统建议进行显式同步?
我很欣赏关于这个问题的一些一般想法,但我也有一些具体的问题:
- Android 何时会同步到文件系统?这可能是周期性的,并且还基于生命周期事件(例如,应用程序的进程进入后台)。
- FileDescriptor.sync() 负责同步元数据吗?这是同步已更改文件的目录。与 FileChannel.force() 进行比较。
- 通常,不会直接写入 FileOutputStream。这是我的解决方案(你同意吗?):
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(); }