我发现Java File锁定机制是一个真正的错误,因为它不能执行锁定的第一条规则-锁定调用时阻塞!除非我错了,否则如果应用程序已经对该文件进行了锁定,则对lock()的调用将引发Exception异常,我知道在我的应用程序中会如此。我在这里浏览了一些答案,很遗憾,我没有使用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;
}

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

最佳答案

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

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

关于Java FileLock阻止无一异常(exception);等待锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15978064/

10-10 13:57
查看更多