这就是我最终做的事情.对于名为“XXX”的每个文件,我使用名为“XXX#LOCK”的零长度锁定文件
>我使用RandomAccessFile将其锁定以进行更新.
>当此锁定文件被锁定时,我操纵有问题的实际文件:读取原始文件,流式传输到临时文件,删除原始文件,以及重命名临时文件等.
>我解锁了锁文件
锁定代码:
File lockFile = new File(target.getParent(), target.getName() + "#LOCK");
lockAccessFile = new RandomAccessFile(lockFile, "rw");
FileChannel lockChannel = lockAccessFile.getChannel();
lock = lockChannel.lock();
解锁代码:
if (lock != null) {
lock.release();
lock = null;
}
if (lockAccessFile != null) {
lockAccessFile.close();
lockAccessFile = null;
}
我将它包装在一个类中,该类使得锁定和解锁与原始文件的读取或写入一起.如您所见,lock和lockAccessFile是成员变量.
我从来没有在锁文件中写任何东西,但它们存在于文件夹中.由于我有少量文件要以这种方式管理(其中6个),我只是将LOCK文件留在那里,因为它是丑陋但无害的开销.
这在我的代码中跨多宿主集群工作,因为我的代码是唯一操纵这些文件的东西.最大的问题是,如果其他一些代码在不知道此约定的情况下开始操作文件,则会导致问题.我没有找到任何证据表明有一种标准的方法来处理这个问题,这个问题将由操作系统强制执行,同时由Java支持.如果您知道,请告诉我.