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