我正在创建一个用于打开和编辑xml文件的简单应用程序.这些文件位于由多个应用程序实例访问的本地文件夹中.我想要做的是锁定由应用程序实例打开的每个文件,以便其他实例无法访问它.
为此,我使用以下代码:
function void readFile(){
File xmlFile = new File("myFile.xml");
RandomAccessFile raf = new RandomAccessFile(xmlFile, "rw");
FileLock fl = raf.getChannel().tryLock();
if(fl==null){
System.out.println("file already locked by another instance");
}else{
setCurrentFile(raf);
setLock(fl);
System.out.println("file successfully locked by this instance");
}
Run Code Online (Sandbox Code Playgroud)
}
因为我想保持对正在编辑的文件的锁定持续时间我不关闭raf也不释放fl.
此时,尝试访问锁定文件的应用程序的任何其他实例都无法执行此操作.到现在为止还挺好.
我观察到以下奇怪的事情:
如果在获取文件锁定后,我在同一文件上打开FileInputStream,即使FileLock对象仍然有效(isValid返回true),应用程序的其他实例现在可以访问正在编辑的文件.
我觉得这个行为很奇怪.谁能解释为什么会这样?
我希望上述内容有道理.提前致谢!