使用java FileChannel FileLock来防止文件写入但允许读取

时间:2014-03-25 21:25:20

标签: java windows locking readwritelock

我认为我误解了FileChannel的锁定功能是如何工作的。

我想对文件进行独占写锁定,但允许从任何进程读取。

在运行Java 7的Windows 7计算机上,我可以使FileChannel的锁定工作,但它会阻止来自其他进程的读取和写入。

如何实现不允许写入但允许其他进程读取的文件锁?

1 个答案:

答案 0 :(得分:5)

  • FileChannel.lock()处理文件区域,而不处理文件本身。
  • 锁可以是共享的(许多读者,没有作者)或独占的(一个作者和没有读者)。

我猜你正在寻找一个不同的功能 - 打开一个文件进行写入,同时允许其他进程打开它进行阅读而不是写入。

这可以通过带有非标准打开选项的Java 7 FileChannel.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中存在的非标准选项。