10

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

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

4

2 回答 2

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

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

于 2015-03-11T16:54:49.393 回答
2

文件副本java.nio.channels.FileChannel

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

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

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

自:1.4

于 2013-04-12T18:43:49.240 回答