2012-09-20 28 views
1

我有应用程序(Java5)分布在多个JVM中,这些JVM从共享存储读取/写入文件(存储由Windows管理)。我想用独占/共享锁文件的读/写如下:Java5 FileInputStream在我可以获取文件锁之前失败

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异常(“进程无法访问该文件,因为正在被另一个进程使用的文件”)将在“新的FileOutputStream(新文件(”/ share/test.dat“))”行中的JVM2上抛出。 它似乎是Catch22的情况:一方面我想获得一个锁来获得I/O流;另一方面,我需要有一个I/O流来获取锁。如我所见,与RandomAccessFile相同的情况。

任何想法?..

回答

1

你可以从错误信息看,Windows只是不会让你做你想做什么。如果您仔细考虑,可以将Windows错误本身视为锁定条件。无论如何,你会遇到同源问题,因为开放和锁定之间的时间窗口。 Windows以某种方式在这里帮你一个忙。一次。

+0

这是否意味着Java的NIO文件锁定机制在Windows中无用?即如果文件当前正在读取/写入另一个进程,我永远不会获得文件锁定。 – Lopotun

+0

@Lopotun这意味着Windows已经有一个用于打开文件的文件锁定机制。你不需要两个。 – EJP

+0

如果是这样,这是非常重要的一点。我从来没有见过它明确提到过。我希望我对这个案件有更多具体的例外。一般的FileNotFoundException混淆。 – Lopotun

相关问题