Java FileLock阻塞没有异常;在等待锁

时间:2013-04-12 18:08:00

标签: java

我发现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;
}

我从不阻挡锁。它总是抛出

2 个答案:

答案 0 :(得分:3)

以下代码演示了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");
    }
}

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

答案 1 :(得分:2)

java.nio.channels.FileChannel的{​​{3}}的副本:

  

public abstract FileLock lock(long position,long size,boolean shared)抛出IOException

     

获取此频道文件的指定区域的锁定。

     

调用此方法将阻塞,直到该区域可以   锁定,此通道已关闭,或者调用线程被中断,   以先到者为准。

     

自:      1.4