【发布时间】:2010-03-19 17:14:49
【问题描述】:
我正在创建一个用于打开和编辑 xml 文件的简单应用程序。 这些文件位于应用程序的多个实例访问的本地文件夹中。 我想要做的是锁定应用程序实例打开的每个文件,以便其他实例无法访问它。
为此,我使用以下代码:
函数 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");
}
}
因为我想在这段时间内保持对正在编辑的文件的锁定,所以我没有关闭 raf 也没有释放 fl。
此时,尝试访问锁定文件的应用程序的任何其他实例都无法访问。到目前为止一切顺利。
我观察到以下奇怪的事情:
如果在获得文件锁定后,我在同一文件上打开 FileInputStream,即使 FileLock 对象仍然有效(isValid 返回 true),应用程序的其他实例现在也可以访问正在编辑的文件。
我觉得这种行为很奇怪。 谁能解释一下为什么会这样?
我希望以上内容有意义。 提前致谢!
【问题讨论】:
-
Windows? Linux?苹果系统?文件锁定实际上是一种操作系统功能。
-
我已经在 MacOS 和 WindowsXP 上测试过了。我知道不同的底层操作系统可能对锁定过程造成的影响。我不认为它与操作系统有任何关系。谢谢!
-
看起来像一个 JDK 错误。您是否尝试提交错误请求?