Java 在操作系统级别的一个原子操作中创建和写入文件

Java 在操作系统级别的一个原子操作中创建和写入文件,java,file,io,atomic,Java,File,Io,Atomic,所以我需要创建一个文件,然后写一行到它,这必须是原子的。这样,当文件处于初始化状态时,其他进程就不能对其进行修补。 我有一个想法,锁上不同的东西,然后当锁被持有时,进行操作,然后释放锁,让另一方进入。但这是相当乏味的,也可能是错误的,因为创建锁并获取它可能不是原子的(我猜)。没有其他方法吗?我建议您编写临时文件,然后将其重命名为您的文件。我不确定该操作是否在java中作为所有操作系统的原子实现,但至少在Unix上您有机会,因为我认为它使用与原子调用相同的调用 我想它在windows上不会是真正

所以我需要创建一个文件,然后写一行到它,这必须是原子的。这样,当文件处于初始化状态时,其他进程就不能对其进行修补。

我有一个想法,锁上不同的东西,然后当锁被持有时,进行操作,然后释放锁,让另一方进入。但这是相当乏味的,也可能是错误的,因为创建锁并获取它可能不是原子的(我猜)。没有其他方法吗?

我建议您编写临时文件,然后将其重命名为您的文件。我不确定该操作是否在java中作为所有操作系统的原子实现,但至少在Unix上您有机会,因为我认为它使用与原子调用相同的调用


我想它在windows上不会是真正的原子。对于大多数应用程序来说,这将是“几乎原子化”的。如果您想要一些能够从其他进程中得到安全保护的东西,我建议您阅读并利用JNI达到操作系统级别。

谢谢,我们已经考虑过了,但是它的javadoc非常令人沮丧。。。无论如何,除了java7
文件。move
之外,似乎没有其他选择。太糟糕了,我们使用的是java6…但是如果我创建了文件,然后锁定它,这也是两个非原子操作(至少使用
FileLock
)。另一个进程可能会在这两个步骤之间溜进,对吗?这将有助于了解您处理的操作系统,以便给出更具体的答案。win7。而在未来,它仍然会是赢家。无论如何,这不是一个大问题,我们愿意使这部分本土。我们很可能会坚持先创建然后重命名的方案。