BufferedInputStream示例
BufferedOutputStream示例
BufferedReader實例
BufferedWriter示例
ByteArrayInputStream示例
Java ByteArrayOutputStream示例
Java CharArrayReader示例
Java CharArrayWriter示例
Java Console類示例
Java DataInputStream類型
Java DataOutputStream實例
Java Externalizable實例
Java File實例
FileDescriptor示例
Java FileInputStream示例
FileOutputStream示例
Java FilePermission示例
Java FileReader示例
Java FileWriter示例
Java FilterInputStream示例
Java FilterOutputStream示例
Java FilterReader示例
Java FilterWriter示例
Java文件鎖
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
}
}
}
}
}