在我获得文件锁定之前,Java5 FileInputStream失败

时间:2012-09-20 10:06:28

标签: java nio file-locking

我的应用程序(Java5)分布在多个JVM中,这些JVM从共享存储读取/写入文件(存储由Windows管理)。我想使用独占/共享锁进行文件写/读,如下所示:

    FileOutputStream fos = null;
    FileLock lock = null;
    ObjectOutputStream oos = null;
    try {
        fos = new FileOutputStream(new File("//share/test.dat"));  // HERE IT MAY THROW FileNotFoundException...
        lock = fos.getChannel().lock(); // ... and I won't acquire a lock.
        oos = new ObjectOutputStream(fos);
        oos.writeObject(value);
        return true;
    } catch (Exception e) {
        // Log it.
    } finally {
        // Close locks and I/O streams.
    }

问题:如果JVM1当前正在读取文件test.dat并且JVM2正在尝试写入同一文件,那么FileNotFoundException(“进程无法访问该文件,因为它正被另一个进程使用”)将在“new FileOutputStream(new File(”/ share / test.dat“))”行中抛出JVM2。 它似乎是Catch22案例:一方面我想获得一个锁来获取I / O流;另一方面,我需要一个I / O流来获取锁。 正如我所看到的,与RandomAccessFile相同的情况。

有什么想法吗?..

1 个答案:

答案 0 :(得分:1)

正如您从错误消息中看到的那样,Windows只是不允许您执行您尝试执行的操作。如果您考虑它,可以将Windows错误本身视为锁定条件。无论如何,你会有一个同源问题,因为打开和锁之间的时间窗口。 Windows在某种程度上对你有帮助。一次。