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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值