简介:
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();
}
}
}
到此关于文件锁的内容介绍完毕,待续...