我想我误解了FileChannel的锁定功能是如何工作的。
我想在一个文件上有一个独占的写锁,但是允许从任何进程读。
在运行Java 7的Windows 7机器上,我可以让FileChannel的锁工作,但它会阻止其他进程的读和写。
如何实现不允许写但允许其他进程读的文件锁?
-
FileChannel.lock()
处理文件区域,而不是文件本身。 - 锁可以是共享的(有很多读,没有写)或独占的(只有一个写,没有读)。
我猜你正在寻找一个有点不同的功能- 打开文件用于写入,同时允许其他进程打开它用于读取但不用于写入。
这可以通过Java 7 FileChannel实现。带有非标准open选项的open API:
import static java.nio.file.StandardOpenOption.*;
import static com.sun.nio.file.ExtendedOpenOption.*;
...
Path path = FileSystems.getDefault().getPath("noshared.tmp");
FileChannel fc = FileChannel.open(path, CREATE, WRITE, NOSHARE_WRITE);
注意ExtendedOpenOption.NOSHARE_WRITE
是Oracle JDK中存在的非标准选项