java中文件加锁机制是怎么实现的。

java中文件加锁机制是怎么实现的。,第1张

Java中文件加锁机制如下:

在对文件 *** 作过程中,有时候需要对文件进行加锁 *** 作,防止其他线程访问该文件。对文件的加锁方法有两种:

第一种方法:使用RandomAccessFile类 *** 作文件。

在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:

RandomAccessFile raf = new RandomAccessFile(file, "rws")

其中的“rws”参数,rw代表读取和写入,s代表了同步方式,也就是同步锁。这种方式打开的文件,就是独占方式的。

第二种方法:使用sun.nio.FileChannel对文件进行加锁。

代码:

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw")

FileChannel fc = raf.getChannel()

FileLock fl = fc.tryLock()

if(fl.isValid())

System.out.println("You have got the file lock.")

以上是通过RandomAccessFile来获得文件锁的,方法如下:

代码:

FileOutputStream fos = new FileOutputStream("file.txt")

FileChannel fc = fos.getChannel()//获取FileChannel对象

FileLock fl = fc.tryLock() //or fc.lock()

if(null != fl)

System.out.println("You have got file lock.")

//TODO write content to file

//TODO write end, should release this lock

fl.release()//释放文件锁

fos.close //关闭文件写 *** 作

如果在读文件 *** 作的时候,对文件进行加锁, *** 作过程如下:

FileChannel也可以从FileInputStream中直接获得,但是这种直接获得FileChannel的对象直接去 *** 作FileLock会报异常NonWritableChannelException,需要自己去实现getChannel方法,代码如下:

private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {

FileChannel channel = null

synchronized(fin){

channel = FileChannelImpl.open(fd, true, true, fin)

return channel

}

}

其实,看FileInputStream时,发现getChannel方法与我们写的代码只有一个地方不同,即open方法的第三个参数不同,如果设置为false,就不能锁住文件了。缺省的getChannel方法,就是false,因此,不能锁住文件。

第12行获得锁失败,lock为null,为什么为null我的看法是:getLock方法是请求获得互斥锁,而你当前eclipse打开这个文件,是持有这个文件的锁的;

解决方法,不要读一个正在被其它程序 *** 作的文件

//有点小建议,下次问这种题可以贴上代码

package com.ruan.io

import java.io.BufferedReader

import java.io.FileInputStream

import java.io.FileOutputStream

import java.io.InputStreamReader

import java.nio.channels.FileLock

/**

* 文件加锁

* @author wangjian

*/

public class LockTester {

public static void main(String[] args) throws Exception{

//加上true参数,不会重新生成一个新的文件。

FileOutputStream fos = new FileOutputStream("d:/a.txt",true)

FileLock fl = fos.getChannel().tryLock()

new ReadLockedFile().start() //试图读取,不成功。

if(fl!=null){

System.err.println("文件已经锁定..")

System.err.println(fl.isShared())

Thread.sleep(1000*60) //锁定1分钟

fl.release() //解除锁定

System.err.println("解除锁定..")

}

}

}

/**

* 用另一个线程读取已经锁定的文件。

*/

class ReadLockedFile extends Thread{

public void run(){

try{

BufferedReader br =

new BufferedReader(new InputStreamReader(new FileInputStream("d:/a.txt")))

String str = br.readLine()

while(str!=null){

System.err.println(str)

str = br.readLine()

}

br.close()

}catch(Exception e){

e.printStackTrace()

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11428873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存