Windows vs OSX FileLock OutputStreamWriter



我编写了一个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)上不工作,异常应该是尝试写入被另一个进程锁定的文件的预期结果。

相关内容

  • 没有找到相关文章

最新更新