|
|
1
6
java.nio.channels.FileChannel 将允许您获得 FileLock 在文件上,使用底层文件系统固有的方法,假设支持此类功能。 这个锁在机器上的进程之间运行,即使是非java进程。(事实上,锁是代表特定JVM实例持有的,因此不适合管理进程中多个线程之间的争用,也不适合管理同一JVM中多个进程之间的争用)。 这里有很多注意事项,但是如果您使用的是Windows,则值得研究。 从javadoc:
|
|
|
2
4
Java本机不支持文件锁定。 如果对文件的争用来自程序内部,那么可能需要在文件副本之上构建额外的同步,以确保并发写入不会相互碰撞。然而,如果争论来自软件外部的某个地方,那么您就无能为力了。您可以尝试将文件写入临时目录,然后重命名它,因为重命名或多或少是原子的(取决于文件系统)。 这将有助于获得更多关于为什么首先需要锁定文件的信息。
在这种情况下,您应该尝试写入临时文件,然后在文件完全复制后重命名它。文件重命名是原子操作(在非网络文件系统上),因此它应该适合您。 |
|
|
3
1
复制文件时,请始终复制到临时文件名,并在完成写入后重命名文件。这样,另一个进程就永远看不到损坏的文件。 更好的是,您可以编写到*.tmp。然后检查目标文件是否存在。将dest文件重命名为*.bak(如果存在)。最后重命名*.tmp->目的地。 |