我编写了一个访问文件的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 OSX上一切正常,但是当我在Windows 7上运行代码时,它会在行处抛出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, 中号
答案 0 :(得分:0)
UNIX上没有文件锁定:http://www.coderanch.com/t/551144/java/java/File-lock-doesn-prevent-threads。实际上,在UNIX上,您可以从进程下删除文件,它甚至可能没有注意到......
因此,您需要使用可以检查存在的锁定文件
矛盾的是,你的代码在Windows上运行,但在UNIX上运行(即Mac OS),例外应该是尝试写入被另一个进程锁定的文件的预期结果。