使用Java的FileChannel和FileLock防止文件写入但允许读取。

5

我觉得我对FileChannel的锁定功能有所误解。

我想要一个文件的独占写锁,但允许其他进程进行读取。

在运行Java 7的Windows 7机器上,我可以使FileChannel的锁定功能正常工作,但它会阻止其他进程进行读取和写入。

如何实现一种文件锁定,禁止其他进程进行写入,但允许其他进程进行读取?

1个回答

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中的非标准选项。

1
为什么他们让它存在于 com.sun.*,但不向用户提供呢? - Jason S
@JasonS 如果你正在运行Oracle JDK或OpenJDK,它是可用的给用户使用的。 - apangin
1
你还需要使用 NOSHARE_DELETE,这样文件就不能被其他进程删除了(FileChannel.lock() 可以防止删除)。 - hinneLinks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接