Java - 锁定文件以进行独占访问

ice*_*fex 5 java locking file file-locking

我的问题是这样的:我正在使用 aWatchService来获取有关特定文件夹中新文件的通知,现在如果在所述文件夹中移动/复制或创建文件,则会触发事件并返回新文件的名称。现在的问题是,如果我尝试访问该文件并且该文件尚未完全存在(例如复制仍在进行中),则会引发异常。我尝试做的是这样的事情:

RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
FileChannel fc = raf.getChannel();
FileLock lck = fc.lock();
Run Code Online (Sandbox Code Playgroud)

但即使获得了锁,如果我尝试写入文件,有时仍然会引发异常,因为另一个进程仍然有一个打开的句柄。

现在,如何锁定 Java 中的文件以实现真正的独占访问?

set*_*thu 4

对我来说,声明

RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 
Run Code Online (Sandbox Code Playgroud)

如果我无法获取文件的锁,则返回 FileNotFoundException。我捕获了 filenotfound 异常并对其进行处理...

public static boolean isFileLocked(String filename) {
    boolean isLocked=false;
    RandomAccessFile fos=null;
    try {
        File file = new File(filename);
        if(file.exists()) {
            fos=new RandomAccessFile(file,"rw");
        }
    } catch (FileNotFoundException e) {
        isLocked=true;
    }catch (Exception e) {
        // handle exception
    }finally {
        try {
            if(fos!=null) {
                fos.close();
            }
        }catch(Exception e) {
            //handle exception
        }
    }
    return isLocked;
}
Run Code Online (Sandbox Code Playgroud)

您可以循环运行它并等待,直到获得文件的锁定。不就行了

FileChannel fc = raf.getChannel();
Run Code Online (Sandbox Code Playgroud)

如果文件被锁定,永远不会到达?你会得到一个 FileNotFoundException 抛出..