NIO支持文件鎖定以同步對文件的訪問。我們可以鎖定文件或整個文件的區(qū)域。文件鎖定機制由操作系統(tǒng)處理。有兩種文件鎖定:排他和共享。
只有一個程序可以保存文件區(qū)域上的排它鎖。多個程序可以在文件的同一區(qū)域上保存共享鎖。不能在文件的同一區(qū)域混合排它鎖和共享鎖。java.nio.channels.FileLock
類表示文件鎖。
通過使用FileChannel
對象的lock()
或tryLock()
方法獲取對文件的鎖。lock()
方法阻止所請求區(qū)域上的鎖是否不可用。tryLock()
方法不阻塞; 如果獲取鎖,它立即返回FileLock
類的對象; 否則返回null
。
lock()
和tryLock()
方法有兩個版本:一個沒有參數(shù),另一個有參數(shù)。不帶參數(shù)的版本方法鎖定整個文件。
帶有參數(shù)的版本接受要鎖定的區(qū)域的起始位置,要鎖定的字節(jié)數(shù)以及用于指示鎖是否共享的布爾標志。如果鎖是共享的,FileLock
對象的isShared()
方法返回true
; 否則返回false
。
以下代碼顯示了獲取文件鎖的不同方法。
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Main {
public static void main(String[] args) throws Exception {
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fileChannel = raf.getChannel();
FileLock lock = fileChannel.lock();
}
}
獲得前10
個字節(jié)的獨占鎖,如下代碼 -
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Main {
public static void main(String[] args) throws Exception {
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fileChannel = raf.getChannel();
// Get an exclusive lock on first 10 bytes
FileLock lock = fileChannel.lock(0, 10, false);
}
}
嘗試獲取整個文件的獨占鎖 -
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Main {
public static void main(String[] args) throws Exception {
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fileChannel = raf.getChannel();
FileLock lock = fileChannel.tryLock();
if (lock == null) {
// Could not get the lock
} else {
// Got the lock
}
}
}
嘗試在共享模式下從第11
個字節(jié)開始鎖定100
個字節(jié)。
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Main {
public static void main(String[] args) throws Exception {
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fileChannel = raf.getChannel();
FileLock lock = fileChannel.tryLock(11, 100, true);
if (lock == null) {
// Could not get the lock
} else {
// Got the lock
}
}
}
以下代碼顯示如何使用try-catch-finally
塊來獲取和釋放文件鎖定,如下所示:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Main {
public static void main(String[] args) throws Exception {
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fileChannel = raf.getChannel();
FileLock lock = null;
try {
lock = fileChannel.lock(0, 10, true);
} catch (IOException e) {
// Handle the exception
} finally {
if (lock != null) {
try {
lock.release();
} catch (IOException e) {
// Handle the exception
}
}
}
}
}