gpt4 book ai didi

Java FileLock 无异常阻塞;等待锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:22:40 25 4
gpt4 key购买 nike

我发现 Java 文件锁定机制是一个真正的错误,因为它不能执行锁定的第一条规则 - 阻塞对锁定的调用!除非我错了 - 如果应用程序已经保持对文件的锁定,则调用 lock() 将抛出异常,我知道我的应用程序就是这种情况。我在这里查看了一些答案,不幸的是我没有使用 Java 7。

有没有人建议我如何处理排他文件锁的等待,而不是让自己陷入 while(true) 循环 :)

在 Aubin 的回答后进行编辑(从评论中复制):

我想做的是在将一个大文件复制到一个目录后访问它,然后对其进行处理。我的代码很简单...

public boolean ifFileReady(File file) {
boolean ready = false;
FileLock lock = null;
FileChannel channel = null;
try {

channel = new RandomAccessFile(file, "rw").getChannel();
lock = channel.lock();
lock.release();
ready = true;
}
catch( IOException e ) {
// Always Here
}
finally
{
if (channel != null)
channel.close();
}
return ready;
}

我从不堵在锁上。它总是抛出

最佳答案

以下代码演示了 lock 确实会阻塞而不会抛出异常。我遇到了类似的问题,但发现异常实际上是由于我的用户没有权限打开文件 rw 引起的。

这是一个完整的程序;同时运行它的两个实例以进行演示

import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

public class Test {
public static void main(String args[]) throws Exception {
FileChannel channel = null;
File lockFile = new File("lock");
System.out.println ("Opening file...");
channel = new RandomAccessFile(lockFile, "rw").getChannel();
System.out.println ("File open. Locking channel...");
channel.lock();
System.out.println ("Channel locked. Sleep for 30 seconds");
Thread.sleep (30000);
System.out.println ("Process terminating");
}
}

为了使代码更简洁,我没有包括解锁、关闭或异常处理(您将收到编译器警告)。进程退出时,操作系统应自动释放所有资源。

关于Java FileLock 无异常阻塞;等待锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978064/

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