Java 之NIO(三) - FileLock

简介:

晒酷学院qq群:979438600

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();
		}
		
	}
}

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

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页