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(); }