如何将行写入文件,每行是原子操作?

时间:2011-10-19 11:54:44

标签: java file filesystems

我想给文件写一些行,我需要每行写一次是原子操作。

例如,我有3行:

111111111111111111111111
222222222222222222222222
333333333333333333333333

当我逐行将它们写入文件时,程序可能会被错误退出,因此保存的数据可能是:

11111111111111111111111
222222

这不是我的预期。我希望每一行都是一个事务,一个原子操作。

我该怎么做?


目前我使用Java来做到这一点。

3 个答案:

答案 0 :(得分:4)

没有100%可靠的方法来保证这一点。

我认为最接近的是通过在输出流上调用flush()然后在底层文件描述符上调用sync()。再次,有一些失败模式,这将无济于事。

答案 1 :(得分:2)

如果您确实需要将新行原子写入文件,我想唯一的方法是使用新名称创建副本,编写新行并将新文件重命名为原始名称。重命名操作是原子的,至少在POSIX下。在Windows上,您需要在重命名之前删除原始文件,这会导致在该过程中出现问题时无法恢复文件的问题。

答案 2 :(得分:1)

您可以使用@aix建议的flush / sync。否则(并且更好 - 99.999%可靠)是使用包含事务支持的某种环境(例如数据库)并使用commit