Java Windows vs OSX文件锁输出StreamWriter

Java Windows vs OSX文件锁输出StreamWriter,java,windows,ioexception,filelock,Java,Windows,Ioexception,Filelock,我编写了一个java应用程序,它可以访问一个文件,而其他VM中的其他进程也会尝试这样做。因此,我使用FileLock类: FileOutputStream fos = new FileOutputStream(filePath,append); FileChannel f = fos.getChannel(); FileLock lock; while ((lock = f.tryLock()) == null){ try {

我编写了一个java应用程序,它可以访问一个文件,而其他VM中的其他进程也会尝试这样做。因此,我使用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)
据我所知,实际获得的锁

f.tryLock()
禁止我访问它,因为另一个进程(显然是这个进程)具有独占锁

现在,我觉得这是一个悖论——当获取锁的实际行为阻碍我这样做时,我如何获得一个独占锁,使我能够写入文件,而不会有其他进程干扰文件的危险

因此,为什么它能在Mac OS上工作而不能在windows上工作?我从JavaDocs中了解到,FileLock类与操作系统有一些特定的差异和困难,但肯定不是针对其功能设计的。 既然不是这样,我就做错了,这就是我请求你帮助的地方

Thx,
M

UNIX上没有文件锁定。:。事实上,在UNIX上,您可以从进程下删除文件,而它甚至可能不会注意到…
因此,您需要使用一个可以检查是否存在的锁定文件。

矛盾的是,您的代码在Windows上工作,而在UNIX(即Mac OS)上不工作,异常情况应该是尝试写入被另一个进程锁定的文件的预期结果。

Thx,谢谢您的回复。不过,我不确定我是否完全理解你和《coderanch邮报》。你说的“没有文件锁定”是指UNIX不提供功能,因此我必须使用FileLock类来提供它吗?而且,根据你的论点,windows提供了文件锁定功能,因此我不需要使用FileLock?如果我理解你的意思,那么它甚至会更进一步,在Windows上尝试使用FIleLock会引发异常:
FIleLock
类是非常特定于操作系统的,在UNIX上它完全不起作用;我觉得这有点没用。在Windows上,它也有自己的问题,正如你在文章中提到的那样。简言之,这有点狡猾。所以我建议使用一个锁文件——也就是说,在某个地方写一些东西,并将其用作外部互斥。你有比那篇文章更多的证据证明这一点吗?原谅广告人,但我不认为CordRangCon特别可靠,因为我在那里看到了相当多的错误信息。如果文件锁定方法实际上没有调用Unix系统的底层
flock()
lockf()
函数或其他等效函数,为什么会出现类似“Linux上每个线程都有文件锁定”这样的错误呢?有很多信息,但在internet上是这样的。有了一些东西,你可以尝试测试用例和一个bug报告——这是一个古老的问题,但解释了潜在的问题。希望有帮助。