Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java FileChannel FileLock防止文件写入但允许读取_Java_Windows_Locking_Readwritelock - Fatal编程技术网

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

使用java FileChannel FileLock防止文件写入但允许读取,java,windows,locking,readwritelock,Java,Windows,Locking,Readwritelock,我想我误解了FileChannel的锁定功能是如何工作的 我想在文件上有一个独占写锁,但允许从任何进程读取 在运行Java7的Windows7机器上,我可以让FileChannel的锁工作,但它会阻止其他进程的读写 如何实现不允许写入但允许其他进程读取的文件锁定? FileChannel.lock()处理文件区域,而不是文件本身 锁可以是共享的(多个读卡器,没有写卡器),也可以是独占的(一个写卡器,没有读卡器) 我想您正在寻找一个稍微不同的功能—打开一个文件进行写入,同时允许其他进程打开它进行

我想我误解了FileChannel的锁定功能是如何工作的

我想在文件上有一个独占写锁,但允许从任何进程读取

在运行Java7的Windows7机器上,我可以让FileChannel的锁工作,但它会阻止其他进程的读写

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

  • FileChannel.lock()
    处理文件区域,而不是文件本身
  • 锁可以是共享的(多个读卡器,没有写卡器),也可以是独占的(一个写卡器,没有读卡器)
我想您正在寻找一个稍微不同的功能—打开一个文件进行写入,同时允许其他进程打开它进行读取,但不允许进行写入

这可以通过具有非标准开放选项的Java 7 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中存在的一个非标准选项。

bah:-(为什么他们让它存在于
com.sun.
中,但用户不可用?@JasonS它对用户可用(如果您正在运行Oracle JDK或OpenJDK)。您也需要
NOSHARE\u DELETE
,这样文件就不能被其他进程删除(
FileChannel.lock()
防止删除)