在Java中,当该文件被其他线程锁定时,有没有办法读取文件?

所以我使用以下命令在文件上创建一个锁,以便我可以独占编辑它:

File file = new File(filename); channel = new RandomAccessFile(file, "rw").getChannel(); lock = channel.tryLock(); 

现在我有第二个线程想要访问同一个文件 – 只是为了阅读,而不是编辑。 我怎么做? 现在第二个线程将抛出一个ioexception并通知我该文件已被锁定。

这可行吗? 有什么建议么? 谢谢

您可以尝试使用tryLock的三个参数版本来请求共享锁。

这是适当的javadoc: http : //download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileChannel.html#tryLock%28long,%20long,%20boolean%29

基本上不是做lock=channel.tryLock()你会做lock = channel.trylock(0, Long.MAX_VALUE, true)

顺便说一句,你应该小心java中的文件锁定。 虽然您可以保证锁在JVM中按预期运行,但您不一定能确保它们在多个进程中按预期运行。

通常,锁定文件是基于操作系统的,当您执行写入锁定时,它将由您获取它的线程独占。 但是,您可以做的一件事是在线程之间共享文件对象(但要小心赛车条件)。 文件锁定

也许这有帮助!

 public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException 

尝试获取此频道文件的给定区域的锁定。

此方法不会阻止。 调用始终立即返回,要么已获取所请求区域的锁定,要么未能执行此操作。 如果由于另一个程序持有重叠锁而无法获取锁,则返回null。 如果由于任何其他原因而无法获取锁定,则会抛出相应的exception。

由位置和大小参数指定的区域不需要包含在实际底层文件中,甚至不重叠。 锁定区域的大小是固定的; 如果锁定区域最初包含文件的末尾并且文件超出该区域,那么该文件的新部分将不会被锁定。 如果预计文件的大小会增加并且需要锁定整个文件,则应锁定从零开始并且不小于文件的预期最大大小的区域。 零参数tryLock()方法只是锁定一个大小为Long.MAX_VALUE的区域。

某些操作系统不支持共享锁,在这种情况下,对共享锁的请求会自动转换为独占锁的请求。 可以通过调用生成的锁对象的isShared方法来测试新获取的锁是共享的还是独占的。

文件锁代表整个Java虚拟机。 它们不适合控制同一虚拟机中多个线程对文件的访问。

参数:position – 锁定区域开始的位置; 必须是非负大小 – 锁定区域的大小; 必须是非负的,并且sum位置+ size必须是非负共享 – true表示请求共享锁,false表示请求独占锁返回:表示新获取锁的锁对象,如果锁可以为null不能获取,因为另一个程序持有重叠锁抛出: IllegalArgumentException – 如果参数的前提条件不保持ClosedChannelException – 如果此通道已关闭OverlappingFileLockException – 如果此Java虚拟机已经拥有与所请求区域重叠的锁,或者如果另一个线程已在此方法中被阻止,并且正在尝试锁定同一文件的重叠区域IOException – 如果发生其他一些I / O错误另请参阅: lock()lock(long,long,boolean)tryLock()