Java 之NIO(三) - FileLock

简介:

Java新IO中提供了文件锁的功能,这样当一个线程锁定一个文件后,其它线程就无法操作此文件,想要使用锁操作文件,可以使用FileLock类实现,FileLock对象可以使用FileChannel获取得到。

在FileChannel中获取Filelock实例的方法列表如下:

public final FileLock lock() 获取此通道文件上的独占锁(排它锁)

public abstract FileLock lock(long position, long size, boolean shared) 获取此通道的文件指定区域的锁,当shared为true时,为共享锁,false为排它锁

以下两个方法与上述两个方法唯一不同点是,lock方法会阻塞程序直到获得文件锁;trylock方法不会阻塞,当另一个程序拥有该文件锁时,直接返回null;

public final FileLock tryLock()

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

解释一下以上提到的锁的类型:

排它锁:只允许一个线程进行文件读写。

共享锁:允许多个线程进行读取操作。

文件锁定之后,进行相应处理完成后,我们需要使用FileLock类解锁后其它线程才能获取锁,Filelock常用方法如下:

public final FileChannel channel() 返回文件锁定的文件通道

public final long position() 返回文件锁锁定区域的第一个字节位置

public final long size() 返回锁定区域的字节数

public final boolean isShared() 判断是否为共享锁

public abstract void release() 在当前锁有效的情况下释放锁


以下通过示例演示如何使用FileLock进行文件锁定及释放等常用操作:

package com.ray.nio.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
/**
 * 
 * @author xuleilei
 *
 */
public class FileLockDemo {
public static void main(String[] args) {

File file = new File("in.txt");
FileInputStream fis = null;
FileChannel fc = null;
try {
fis = new FileInputStream(file);
fc = fis.getChannel();

FileLock fl = fc.tryLock(); //试图获得文件锁,注意这里可能返回NULL
if(fl != null){
System.out.println(file.getName() + "进入锁定状态...");
try {
Thread.sleep(3000); //在此停留3秒,模拟对文件进行读写等其他操作。
} catch (InterruptedException e) {
e.printStackTrace();
}
fl.release(); //释放当前锁
System.out.println(file.getName() + "已经释放锁定...");
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}

到此关于文件锁的内容介绍完毕,待续...


你可能感兴趣的:(Java 之NIO(三) - FileLock)