NIO支援檔案鎖定以同步對檔案的存取。我們可以鎖定檔案或整個檔案的區域。檔案鎖定機制由作業系統處理。有兩種檔案鎖定:排他和共用。
只有一個程式可以儲存檔案區域上的排它鎖。多個程式可以在檔案的同一區域上儲存共用鎖。不能在檔案的同一區域混合排它鎖和共用鎖。java.nio.channels.FileLock
類表示檔案鎖。
通過使用FileChannel
物件的lock()
或tryLock()
方法獲取對檔案的鎖。lock()
方法阻止所請求區域上的鎖是否不可用。tryLock()
方法不阻塞; 如果獲取鎖,它立即返回FileLock
類的物件; 否則返回null
。
lock()
和tryLock()
方法有兩個版本:一個沒有引數,另一個有引數。不帶引數的版本方法鎖定整個檔案。
帶有引數的版本接受要鎖定的區域的起始位置,要鎖定的位元組數以及用於指示鎖是否共用的布林標誌。如果鎖是共用的,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
個位元組的獨占鎖,如下程式碼 -
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
個位元組開始鎖定100
個位元組。
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
}
}
}
}
}