尝试锁定文件通道时出现重叠文件锁定异常

6

前提条件:

  • 每次尝试锁定文件时(适用于所有文件),我都会遇到OverlappingFileLockException异常
  • 我有一台刚开机的计算机
  • 在Eclipse、Java v1.6上进行了测试,同时测试了Windows/Linux
  • 只有一个实例的Eclipse正在运行此单个程序
  • 此程序中只有一个线程在运行(事件分派线程)
  • 我尝试锁定从未被触及过的文件
  • 使用lock()和trylock()都会出现相同的问题
  • 将FileOutputStream()更改为RandomAccessFile()会产生相同的结果

我正在尝试在静态函数中锁定一个文件,该函数返回一个包含通道和锁的组合对象,以便可以使用另一个函数unlockFile(FileLocking fl)关闭通道并释放锁。组合对象类如下:

   public class FileLocking {
    public FileChannel channel;
    public FileLock lock;

    public FileLocking(FileChannel f, FileLock l) {
        channel = f;
        lock = l;
    }

文件锁定的函数如下所示:
public static synchronized FileLocking lockFile(String fileName) {
FileLocking result = null;
FileChannel channel = null;
try {
    channel = new FileOutputStream(fileName).getChannel();
    FileLock lock = channel.lock();
    lock = channel.tryLock();
    result = new FileLocking(channel, lock);
} catch (Exception e) {
    Log(ERR, "Exception when locking " + e.getMessage());
    e.printStackTrace();
} finally {
    try {
        channel.close();
    } catch (IOException e) {
        Log(ERR, "IOE: " + e.getMessage());
        e.printStackTrace();
    }
}
return result;

目前,我遇到以下错误:

[ERR]: (pid:13) Exception when locking null
java.nio.channels.OverlappingFileLockException
at sun.nio.ch.FileChannelImpl$SharedFileLockTable.checkList(Unknown Source)
at sun.nio.ch.FileChannelImpl$SharedFileLockTable.add(Unknown Source)
at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
at java.nio.channels.FileChannel.tryLock(Unknown Source)
at com.xxx.utils.FileLocking.lockFile(FileLocking.java:29)`

非常欢迎解释和/或编码技巧。


为什么你的异常信息是 null?这有点奇怪。 - Marcelo
1个回答

10

为什么在使用lock后又要调用tryLock?难道我漏掉了什么吗?

当你第二次调用tryLock时,由于锁已被JVM持有,因此会导致OverlappingFileLockException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接