日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java对文件加锁

發布時間:2025/7/14 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java对文件加锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt208

在對文件操作過程中,有時候需要對文件進行加鎖操作,防止其他線程訪問該文件。對文件的加鎖方法有兩種:

第一種方法:使用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; ?//關閉文件寫操作

?

如果在讀文件操作的時候,對文件進行加鎖,怎么操作呢?從API文檔中我們可以看到,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,因此,不能鎖住文件。

總結

以上是生活随笔為你收集整理的java对文件加锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。