2011-12-30 49 views
3

我的问题是这样的:我使用WatchService来获得关于特定文件夹中的新文件的通知,现在如果文件在所述文件夹中被移动/复制或创建,则触发事件并返回新文件的名称。现在的问题是,如果我尝试访问该文件并且尚未完全访问(例如复制仍在进行中),则会引发异常。我试过是做这样的事情:Java - 锁定独占访问的文件

RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 
FileChannel fc = raf.getChannel(); 
FileLock lck = fc.lock(); 

但即使锁被收购,有时仍然是一个异常被,如果我尝试写入文件,因为另一个进程仍具有打开的句柄给它提出的。

现在,Java中的文件如何被锁定以实现真正的独占访问?

回答

3

对于我来说,语句

RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 

返回一个FileNotFoundException异常,如果我不能获得该文件的锁。我赶上filenotfound异常,并把它...

public static boolean isFileLocked(String filename) { 
    boolean isLocked=false; 
    RandomAccessFile fos=null; 
    try { 
     File file = new File(filename); 
     if(file.exists()) { 
      fos=new RandomAccessFile(file,"rw"); 
     } 
    } catch (FileNotFoundException e) { 
     isLocked=true; 
    }catch (Exception e) { 
     // handle exception 
    }finally { 
     try { 
      if(fos!=null) { 
       fos.close(); 
      } 
     }catch(Exception e) { 
      //handle exception 
     } 
    } 
    return isLocked; 
} 

,你可以在一个循环中运行这一点,等到你在文件上的锁。不会行

FileChannel fc = raf.getChannel(); 

如果文件被锁定,永远不会到达?你会得到一个FileNotFoundException抛出..