📅  最后修改于: 2020-11-14 10:16:50             🧑  作者: Mango
我们知道Java NIO支持并发和多线程,这使它能够同时处理在多个文件上运行的多个线程,但是在某些情况下,我们要求文件不能被任何线程共享并且不可访问。
为了满足这种要求,NIO再次提供了一个称为FileLock的API,该API用于提供对整个文件或文件一部分的锁定,以使该文件或其部分不会共享或不可访问。
为了提供或应用这种锁,我们必须使用FileChannel或AsynchronousFileChannel,为此目的提供了两种方法lock()和tryLock() 。提供的锁可能有两种类型-
排他锁-排他锁可防止其他程序获取任一类型的重叠锁。
共享锁-共享锁可防止其他同时运行的程序获取重叠的排他锁,但允许它们获取重叠的共享锁。
用于获取锁定文件的方法-
lock() -FileChannel或AsynchronousFileChannel的此方法获取与给定通道关联的文件的排他锁。此方法的返回类型为FileLock,该方法还用于监视获取的锁。
lock(长位置,长大小,布尔共享) -此方法再次是lock方法的重载方法,用于锁定文件的特定部分。
tryLock() -如果无法获取该锁,并且尝试获取此通道文件上的显式排他锁,则此方法返回FileLock或null。
tryLock(长位置,长尺寸,布尔共享) -此方法尝试获取此通道文件给定区域上的锁,该锁可以是互斥类型或共享类型。
acquisitionBy() -此方法返回获取文件锁定的通道。
position() -此方法返回锁定区域第一个字节在文件中的位置。锁定区域不必包含在实际的基础文件中,甚至不需要重叠,因此此方法返回的值可能会超过文件的目前的规模。
size() -此方法返回锁定区域的大小(以字节为单位)。锁定区域不必包含在实际的基础文件中,甚至不必与之重叠,因此此方法返回的值可能会超过文件的当前大小。
isShared() -此方法用于确定是否共享锁。
重叠(长位置,长尺寸) -此方法告诉此锁是否与给定的锁范围重叠。
isValid() -此方法告知所获取的锁是否有效。锁对象在释放前或关闭关联的文件通道之前一直保持有效,以先到者为准。
release() -释放获得的锁。如果锁对象有效,则调用此方法将释放锁并使该对象无效。如果此锁定对象无效,则调用此方法无效。
close() -此方法调用release()方法。它已添加到类中,以便可以与自动资源管理块构造结合使用。
下面的示例创建文件锁定并向其中写入内容
package com.java.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileLockExample {
public static void main(String[] args) throws IOException {
String input = "Demo text to be written in locked mode.";
System.out.println("Input string to the test file is: " + input);
ByteBuffer buf = ByteBuffer.wrap(input.getBytes());
String fp = "D:file.txt";
Path pt = Paths.get(fp);
FileChannel channel = FileChannel.open(pt, StandardOpenOption.WRITE,StandardOpenOption.APPEND);
channel.position(channel.size() - 1); // position of a cursor at the end of file
FileLock lock = channel.lock();
System.out.println("The Lock is shared: " + lock.isShared());
channel.write(buf);
channel.close(); // Releases the Lock
System.out.println("Content Writing is complete. Therefore close the channel and release the lock.");
PrintFileCreated.print(fp);
}
}
package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class PrintFileCreated {
public static void print(String path) throws IOException {
FileReader filereader = new FileReader(path);
BufferedReader bufferedreader = new BufferedReader(filereader);
String tr = bufferedreader.readLine();
System.out.println("The Content of testout.txt file is: ");
while (tr != null) {
System.out.println(" " + tr);
tr = bufferedreader.readLine();
}
filereader.close();
bufferedreader.close();
}
}
Input string to the test file is: Demo text to be written in locked mode.
The Lock is shared: false
Content Writing is complete. Therefore close the channel and release the lock.
The Content of testout.txt file is:
To be or not to be?Demo text to be written in locked mode.