- Java NIO 教程
- Java NIO - 首页
- Java NIO - 概述
- Java NIO - 环境设置
- Java NIO vs JAVA IO
- Java NIO - 通道
- Java NIO - 文件通道
- Java NIO - 数据报通道
- Java NIO - 套接字通道
- Java NIO - 服务器套接字通道
- Java NIO - 散射
- Java NIO - 聚集
- Java NIO - 缓冲区
- Java NIO - 选择器
- Java NIO - 管道
- Java NIO - 路径
- Java NIO - 文件
- Java NIO - AsynchronousFileChannel(异步文件通道)
- Java NIO - 字符集
- Java NIO - 文件锁
- Java NIO 有用资源
- Java NIO - 快速指南
- Java NIO - 有用资源
- Java NIO - 讨论
Java NIO - 文件锁
众所周知,Java NIO 支持并发和多线程,这使其能够处理同时对多个文件进行操作的多个线程。但在某些情况下,我们需要确保我们的文件不会被任何线程共享,并且无法访问。
对于这样的需求,NIO 又提供了一个名为 FileLock 的 API,用于对整个文件或文件的一部分提供锁,以便文件或其部分不会被共享或访问。
为了提供或应用此类锁,我们必须使用 FileChannel 或 AsynchronousFileChannel,它们为此目的提供了两种方法:lock() 和 tryLock()。提供的锁可以是两种类型之一:
独占锁 - 独占锁阻止其他程序获取任何类型的重叠锁。
共享锁 - 共享锁阻止其他并发运行的程序获取重叠的独占锁,但允许它们获取重叠的共享锁。
用于获取文件锁的方法:
lock() - FileChannel 或 AsynchronousFileChannel 的此方法获取与给定通道关联的文件上的独占锁。此方法的返回类型是 FileLock,可进一步用于监控获得的锁。
lock(long position, long size, boolean shared) - 此方法是 lock 方法的重载方法,用于锁定文件的特定部分。
tryLock() - 此方法返回一个 FileLock 或 null(如果无法获取锁),它尝试在此通道的文件上获取显式独占锁。
tryLock(long position, long size, boolean shared) - 此方法尝试在此通道文件的给定区域上获取锁,该锁可以是独占锁或共享锁。
FileLock 类的使用方法
acquiredBy() - 此方法返回获取文件锁的通道。
position() - 此方法返回锁定的区域第一个字节在文件中的位置。锁定的区域不必包含在实际的基础文件中,甚至可能与之重叠,因此此方法返回的值可能超过文件的当前大小。
size() - 此方法返回锁定的区域大小(以字节为单位)。锁定的区域不必包含在实际的基础文件中,甚至可能与之重叠,因此此方法返回的值可能超过文件的当前大小。
isShared() - 此方法用于确定锁是否是共享锁。
overlaps(long position,long size) - 此方法指示此锁是否与给定的锁定范围重叠。
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.