我编写了一个java应用程序,它访问一个文件,而其他虚拟机中的其他进程也尝试这样做。因此,我使用FileLock类:
FileOutputStream fos = new FileOutputStream(filePath,append);
FileChannel f = fos.getChannel();
FileLock lock;
while ((lock = f.tryLock()) == null){
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
}
}
OutputStreamWriter out = new OutputStreamWriter( new FileOutputStream(filePath,append));
out.write(textToWrite);
out.close();
lock.release();
在MacOSX上一切都很好,但当我在Windows7上运行代码时,它会在行引发IOException
out.close();
,在尝试冲洗时。
java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at java.io.FileOutputStream.writeBytes(Native Method)
据我从FileLock是如何工作的?,使用实际获得锁定
f.tryLock()
禁止我访问它,因为另一个进程(显然是这个进程)有独占锁。
现在,我觉得这是一个悖论——当获得锁的实际行为阻碍我这样做时,我如何获得一个独占锁,使我能够在没有其他进程干扰的情况下写入文件?
因此,为什么它能在Mac操作系统上工作,而不能在windows上工作?我从JavaDocs中了解到,FileLock类存在特定于操作系统的差异和困难,但肯定不是针对其功能设计的。既然不可能是这样,我做错了什么,这就是我请求你帮助的地方。
Thx,M
在UNIX上没有文件锁定。:http://www.coderanch.com/t/551144/java/java/File-lock-doesn-prevent-threads.事实上,在UNIX上,您可以从进程中删除文件,但它甚至可能不会注意到
因此,您需要使用一个可以检查是否存在的锁定文件
矛盾的是,您的代码在Windows上工作,但在UNIX(即Mac OS)上不工作,异常应该是尝试写入被另一个进程锁定的文件的预期结果。