gpt4 book ai didi

Java 文件锁定

转载 作者:行者123 更新时间:2023-11-29 06:46:37 24 4
gpt4 key购买 nike

我已经编写了以下帮助程序类,它应该允许我获得对文件的独占锁定,然后对其执行某些操作。

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);
}

当我运行此测试时,调用 channel.lock() 时会抛出 OverlappingFileLockException。我不清楚为什么会这样,因为我只尝试锁定此文件一次。

无论如何,lock() 方法的 JavaDocs 是这样说的:

An invocation of this method will block until the region can be locked, this channel is closed, or the invoking thread is interrupted, whichever comes first.

因此,即使文件已被锁定,lock() 方法似乎也应该阻止,而不是抛出 OverlappingFileLockException

我想我误解了 FileLock 的一些基本内容。我在 Windows XP 上运行(以防相关)。

谢谢,唐

最佳答案

您锁定了两次文件并且永远不会释放第一次锁定:

    // Get an exclusive lock on the whole file
FileLock lock = channel.lock();
try {
lock = channel.lock();
doWithLockedFile(file);
} finally {
lock.release();
}

当你重用 var 锁时,你在哪里释放第一个锁?

你的代码应该是:

    // Get an exclusive lock on the whole file
FileLock lock = null;
try {
lock = channel.lock();
doWithLockedFile(file);
} finally {
if(lock!=null) {
lock.release();
}
}

关于Java 文件锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com