Java FileLock阻止无例外; 等待锁定

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

有没有人有建议,我可能会处理等待独占文件锁,而不让自己在一段while(true)循环:)

奥宾的答案后编辑(复制来自评论):

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

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

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


java.nio.channels.FileChannel文档的副本:

公共抽象FileLock锁(长位置,长尺寸,布尔共享)抛出IOException

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

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

由于:1.4


下面的代码演示了锁确实没有抛出异常而阻塞。 我有一个类似的问题,但发现这个异常实际上是由于我的用户没有权限时打开文件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");
    }
}

为了让代码更加清晰,我没有包含解锁,关闭或异常处理(您将得到编译器警告)。 当进程退出时,所有的资源应该由操作系统自动释放。

链接地址: http://www.djcxy.com/p/70869.html

上一篇: Java FileLock blocking without exceptions; waiting on the lock

下一篇: Why must I enter "\\\0" to create a string "\0" in zsh?