public abstract class LockedFileOperation {
public void execute(File file) throws IOException {
if (!file.exists()) {
throw new FileNotFoundException(file.getAbsolutePath());
}
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
// Get an exclusive lock on the whole file
FileLock lock = channel.lock();
try {
lock = channel.lock();
doWithLockedFile(file);
} finally {
lock.release();
}
}
public abstract void doWithLockedFile(File file) throws IOException;
}
我写了一个单元测试,它创建了
LockedFileOperation
试图重命名锁定文件的
public void testFileLocking() throws Exception {
File file = new File("C:/Temp/foo/bar.txt");
final File newFile = new File("C:/Temp/foo/bar2.txt");
new LockedFileOperation() {
@Override
public void doWithLockedFile(File file) throws IOException {
if (!file.renameTo(newFile)) {
throw new IOException("Failed to rename " + file + " to " + newFile);
}
}
}.execute(file);
}
OverlappingFileLockException
当
channel.lock()
被称为。我不清楚为什么会发生这种情况,因为我只试图锁定此文件一次。
在任何情况下
lock()
调用此方法将
此频道已关闭,或
调用线程被中断,
所以即使文件已经被锁定
锁定()
方法应该阻塞,而不是抛出
重叠文件锁定异常
我想有一些基本的
FileLock
我是误会。我在WindowsXP上运行(以防万一)。
谢谢,
唐