在Java中,当文件被其他线程锁定时,是否可以读取该文件?
|
因此,我使用以下命令在文件上创建了一个锁,以便可以对其进行独占编辑:
File file = new File(filename);
channel = new RandomAccessFile(file, \"rw\").getChannel();
lock = channel.tryLock();
现在,我有第二个线程想要访问相同的文件-只是读取而不是编辑。我怎么做?现在,第二个线程将引发io异常,并通知我文件已锁定。
这可行吗?有什么建议么?谢谢
没有找到相关结果
已邀请:
3 个回复
版萍层分
你会做
顺便说一句,您应谨慎使用Java中的文件锁定。尽管可以保证锁在JVM中的行为符合预期,但是不一定要确保它们在多个进程中的行为均符合预期。
窝头菊
氏脑
尝试在此通道文件的给定区域上获得锁定。 此方法不会阻止。调用总是立即返回, 要么已经锁定了 请求的区域或未能 这样做。如果无法获取锁 因为由 另一个程序然后返回null。 如果无法获得任何锁 其他原因然后适当 抛出异常。 由position和size参数指定的区域不需要 被包含在,甚至重叠, 实际的基础文件。锁 区域的大小是固定的;如果被锁定 区域最初包含的结尾 该文件,并且文件超出了 区域,然后是 文件不会被锁覆盖。 如果文件预期会增大 整个文件的锁是 所需的区域 零,且不小于预期 文件的最大大小,应为 锁定。零参数
方法只是锁定一个大小的区域
。 某些操作系统不支持共享锁,在这种情况下, 共享锁的请求是 自动转换为请求 排他锁。是否 新获得的锁被共享或 排他性可以通过调用进行测试 生成的锁对象的isShared 方法。 文件锁代表整个Java虚拟机保留。他们 不适合控制 通过多个线程访问文件 在同一虚拟机中。 参数: position-锁定区域开始的位置; 必须为非负数 size-锁定区域的大小;必须为非负数,并且 总和头寸+大小必须为 非负的 shared-真,请求共享锁,假,请求共享锁 排他锁 返回值: 代表新获取的锁的锁对象;如果 无法获取锁,因为 另一个程序重叠 锁 抛出:
-如果参数的前提条件 不举行
-如果此频道关闭
-如果锁与要求的重叠 该Java已经拥有该区域 虚拟机,或者另一个线程 已被此方法阻止,并且 试图锁定重叠 同一文件的区域
-如果发生其他I / O错误 也可以看看:
,
,