鍍金池/ 教程/ Java/ Java文件鎖
Java文件屬性
Java FilePermission示例
Java Externalizable實例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實例
Java FileReader示例
Java控制臺
Java文件所有者權限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標準輸入/輸出/錯誤流
Java文件內容和讀寫
Java FilterInputStream示例
Java內存通道
Java路徑
Java令牌和字符串拆分
Java隨機訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實例
FileDescriptor示例

Java文件鎖

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
        }
      }
    }

  }
}