Windows vs OSX FileLock OutputStreamWriter

时间:2013-02-20 10:45:18

标签: java windows ioexception filelock

我编写了一个访问文件的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, 中号

1 个答案:

答案 0 :(得分:0)

UNIX上没有文件锁定:http://www.coderanch.com/t/551144/java/java/File-lock-doesn-prevent-threads。实际上,在UNIX上,您可以从进程下删除文件,它甚至可能没有注意到......
因此,您需要使用可以检查存在的锁定文件 矛盾的是,你的代码在Windows上运行,但在UNIX上运行(即Mac OS),例外应该是尝试写入被另一个进程锁定的文件的预期结果。