我编写了一个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();所有这些在Mac上都运行得很好,但是当我在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)据我从How does FileLock work?了解,锁的实际获取是通过
f.tryLock()禁止我访问它,因为另一个进程(显然是这个进程)有排它锁。
现在,我觉得这是一个悖论--当获得锁的实际操作阻碍我这样做时,我如何获得一个外部锁,使我能够写入文件,而不会有其他进程干扰它的危险?
因此,为什么它可以在Mac OS上运行,而不能在windows上运行?我从JavaDocs中了解到,FileLock类存在特定于操作系统的差异和困难,但肯定不是针对其设计的功能。既然情况不是这样,我做错了什么,这就是我向你寻求帮助的地方。
Thx,M
发布于 2013-02-20 18:49:40
在UNIX上没有文件锁定。:http://www.coderanch.com/t/551144/java/java/File-lock-doesn-prevent-threads。事实上,在UNIX上,您可以从进程下删除文件,而它可能甚至不会注意到...
所以你需要使用一个你可以检查是否存在的锁文件。
矛盾的是,您的代码可以在Windows上运行,但不能在UNIX (即Mac OS)上运行,例外情况应该是尝试写入被另一个进程锁定的文件的预期结果。
https://stackoverflow.com/questions/14977905
复制相似问题