Mar*_*ger 13 java android fsync fileoutputstream ext4
Tim Bray的文章"安全地保存数据"给我留下了悬而未决的问题.今天,已经有一个多月了,我还没有看到任何跟进,所以我决定在这里讨论这个话题.
本文的一点是,在使用FileOutputStream时,应该调用FileDescriptor.sync()以保证安全.起初,我非常恼火,因为在我做Java的12年中,我从未见过任何Java代码进行同步.特别是因为处理文件是一件非常基本的事情.此外,FileOutputStream的标准JavaDoc从未暗示过同步(Java 1.0 - 6).经过一番研究,我认为ext4实际上可能是第一个需要同步的主流文件系统.(是否有建议使用显式同步的其他文件系统?)
我很欣赏这方面的一些一般性想法,但我也有一些具体的问题:
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();
}
hac*_*bod 10
Android将在需要时进行同步 - 例如当屏幕关闭,关闭设备等时.如果您只是在查看"正常"操作,则永远不需要应用程序进行显式同步.
当用户将电池从设备中拉出(或者对内核进行硬重置)时,问题就出现了,并且您希望确保不丢失任何数据.
所以首先要意识到的是:问题是电源突然丢失,因此无法实现干净关闭,以及此时持久存储将会发生什么的问题.
如果您只是编写一个独立的新文件,那么您的工作并不重要.在你开始写作之前,用户可能已经在你写入的过程中拉了电池,等等.如果你没有同步,这只意味着你写完笔记本电脑的时间比较长将失去数据.
这里最关心的是您想要更新文件.在这种情况下,当你再次读取该文件你想有任何的以前的内容,或对新的内容.你不希望得到一些中途写入或丢失数据的东西.
这通常通过将数据写入新文件,然后切换到旧文件中的数据来完成.在ext4之前,你知道,一旦你完成了一个文件的编写,对其他文件的进一步操作将不会在该文件上的文件上进行,因此你可以安全地删除以前的文件或者执行依赖于你的新文件的操作完全写好.
但是现在如果您编写新文件,然后删除旧文件,并且电池被拉,当您下次启动时,您可能会看到旧文件被删除并且新文件已创建,但新文件的内容未完成.通过执行同步,您可以确保在该点完全写入新文件,因此可以进行依赖于该状态的进一步更改(例如删除旧文件).
| 归档时间: |
|
| 查看次数: |
4245 次 |
| 最近记录: |