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相同的情况。
任何想法?..
这是否意味着Java的NIO文件锁定机制在Windows中无用?即如果文件当前正在读取/写入另一个进程,我永远不会获得文件锁定。 – Lopotun
@Lopotun这意味着Windows已经有一个用于打开文件的文件锁定机制。你不需要两个。 – EJP
如果是这样,这是非常重要的一点。我从来没有见过它明确提到过。我希望我对这个案件有更多具体的例外。一般的FileNotFoundException混淆。 – Lopotun