原子文件写入操作(跨平台)
如何建立原子文件写入操作?该文件将由Java服务编写,并由python脚本读取。
对于记录,读取远大于写入。但是写操作是成批发生的,而且往往很长。文件大小为兆字节。
现在,我的方法是:
- 将文件内容写入同一目录中的临时文件
- 删除旧文件
- 将临时文件重命名为旧文件名。
这是正确的方法吗?如何避免出现删除旧文件但尚未重命名新文件名的情况?
这些编程语言( python和java )是否提供锁定和避免这种情况的构造?
-
AFAIK号
原因是要使这种原子操作成为可能,必须以事务性文件系统的形式提供OS支持。主流操作系统都没有提供事务性文件系统。
编辑
-至少对于符合POSIX的系统,我错了。rename
如果@janneb指出,如果具有目标名称的文件已经存在,则POSIX系统调用将执行原子替换。这应该足以自动执行OP的操作。但是,事实仍然是, 不能
File.renameTo()
明确保证Java方法是原子方法,因此它不能为OP问题提供跨平台的解决方案。 __编辑2- 使用Java 7,您可以将其
java.nio.file.Files.move(Path source, Path target, CopyOption... options)
与copyOptions和一起使用ATOMIC_MOVE
。如果(操作系统/文件系统)不支持此功能,则应获取异常。