一.FileLock(通道文件锁,记录区域锁):表示文件区域锁定标记.FileLock并没有实现lock接口,它仅仅是一个辅助锁操作类.每次通过FileChannel.lock()或者tryLock()获取文件锁.一旦获取锁,那么lock将持续有效,直到被release(),以及JVM退出.可以通过对fileLock.isValid()检测锁的有效性.
文件锁要么是独占的,有么是共享的.共享锁可以阻止并发运行的程序获取独占锁,但是允许程序继续获取共享锁.独占锁阻止其他获取任意类型锁.可以通过isShared()检测锁的模式.某些平台不支持文件共享锁,则共享锁请求被升级为独占锁,此后操作将以独占锁执行.
单个JVM在某个特定文件上所保持的锁是不重叠的(即在进程级别不会重复获取锁).要测试某个候选锁定范围是否与现有的锁定重叠,可以使用overlaps方法.
文件锁和通道(file)关联.文件锁是以JVM进程为单位保持(OS特性).它们不适应于控制同一个JVM内多个线程对文件的访问.(多线程下对文件访问),但是fileLock对象可以在多线程环境中安全使用.
FileLock最终直接映射为底层操作系统的"文件锁",FileLock的特性将受制于OS;因为任何进程都可以透明的获得文件锁的情况.在某些平台上,某个通道释放锁,会导致JVM进程释放底层文件的所有锁定,不管该锁是否为该通道获取的.因为我们为了避免这些因平台不同而带来的潜在问题,建议一个JVM进程中,对特定文件,FileChannel应该被唯一化.
- protected FileLock(FileChannel channel,long position,long size,boolean shared):初始化一个fileLock,并制定锁关联的channel,以及需要锁定的文件区域,锁的模式.FileLock不能直接被实例化,在API级别,可以在FileChannel.lock(...)获得需要的文件锁.每个FileLock实例都会持有position,size,shared属性,而且将不能再被改变.
- public final FileChannel channel():返回当前lock锁关联度FileChannel.
- public final boolean overlaps(long position,long size):判断此锁定区域是否与制定的区域重叠,只要当前lock覆盖至少一个直接时返回true.
- public abstract boolean isValid():检测此锁是否有效,此值有底层控制,FileLockImpl.当锁获取成功时,此值为true.如果锁被release或者fileChannle被关闭,将返回false.
- public abstract void release():释放锁.如果此时fileChannel已经关闭,则抛出ClosedChannelException.此后将间接调用fileChannel.release(fileLock)来释放锁.因此可见,锁的获取和释放,均和关联的channel有关.需要声明的是,FileLock仅仅是一个API级别的锁状态表示,他持有锁的一些信息,但FileLock本身无法改变锁的状态,只能间接的通过FileChannel来操作.
二.FileChannel(文件通道类):此类为抽象类,底层有FileChannelImpl支持.
源代码参考:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/nio/ch/FileChannelImpl.html
FileChannel实现了InterrutableChannel/GatheringByteChannel/ScatteringByteChannel,它并没有向其他Socket通讯通道实现SelectableChannel.
FileChannel用于读取/写入/Mapping文件的通道.
- 以不影响通道当前位置的方式,对文件中绝对位置的字节进行读取或者写入.
- 将文件中的某个区域直接Mapping到内存中,对于较大的文件,这通常比调用普通的read或者write方法更加有效.
- 强制(force)对底层存储设备进行文件的更新,确保在系统崩溃时不丢失数据.
- 以一种可被操作系统优化为直接向文件缓存发送或者从中读取的高速传递方法,将字节从文件传输到某个其他通道.
- 可以lock指定的文件区域,以防止其他程序进行访问.
多个并发线程可安全地使用文件通道。可随时调用关闭方法,正如 Channel 接口中所指定的。对于涉及通道位置或者可以更改其文件大小的操作,在任意给定时间只能进行一个这样的操作;如果尝试在第一个操作仍在进行时发起第二个操作,则会导致在第一个操作完成之前阻塞第二个操作。
可以并发处理其他操作,特别是那些采用显式位置的操作;但是否并发处理则取决于基础实现,因此是未指定的。
此外我们可以在FileChannel中查看到2个方法:transferFrom和transferTo,用来实现“zero-copy”(socket sendfile特性),即允许将文件中的数据直接发送到socket中,或者从socket中直接读取数据进而写入File中。
通过FileInputStream.getChannel()获得的通道,只能read.通过FileOutputStream.getChannel()获取的通道,只能write.FileChannel,不能创建文件.RandomAccessFile在"r"模式下为只读,在"rw"模式下允许读写.
相关推荐
05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-...
Java NIO-Channel-FileChannel详解(一) - **主要内容**:深入探讨FileChannel的高级用法,如文件锁定等。 - **学习目标**:掌握FileChannel的进阶功能。 #### 6. Java NIO-Channel-FileChannel详解(二) - **主要...
### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...
### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...
《Java IO:从NIO到Reactor三种模式详解》 在Java编程中,IO操作是不可或缺的一部分,尤其在处理大量数据传输或者网络通信时。本文将深入探讨Java中的三种IO模型:传统IO(BIO)、非阻塞IO(NIO)以及反应器模式...
### Java NIO API详解 #### 一、引言 在Java早期版本中,I/O操作主要依赖于`java.io`包中的流式API,这些API虽然简单易用,但其本质是阻塞式的,这意味着每次读写操作都会等待直至完成。这种机制在处理大量并发...
而在NIO中,数据的读写不再通过流,而是通过通道(如`FileChannel`)来完成,通道可以与多个缓冲区进行交互,缓冲区则用于临时存储数据。 NIO的核心组件包括: 1. **通道(Channels)**:通道类似于流,但不同的是...
Java.nio.channels包中定义了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信。通道可以与缓冲区交互,数据通过通道读入或写出缓冲区。 3. **选择器(Selector)**:...
2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个开放的I/O资源,数据可以通过Channel进行传输。Selector是这个包中的另一个重要组件,它允许...
Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel分别用于网络连接的读写。通道与传统流的区别在于,通道是双向的,可以同时进行读写操作,而流通常是单向的。 缓冲...
【Java 高并发八:NIO和AIO详解】 NIO(New Input/Output),从Java 1.4版本开始引入,是对传统IO模型的一种改进。传统的IO模型基于流(Stream),而NIO则基于块(Block)进行数据传输,提高了处理大量数据时的效率...
### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...
### Java NIO 原理与使用详解 #### 一、Java NIO 概述 在深入了解 Java NIO 的工作原理及其使用之前,我们首先来了解一下什么是 Java NIO(New I/O)。Java NIO 是 Java SE 1.4 版本引入的一个全新的 I/O API,...
### NIO 入门知识点详解 #### 一、NIO 的引入及其背景 - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速...
### Java NIO 相关知识点详解 #### Java NIO 概述 Java NIO(New IO)是从 Java 1.4 版本开始引入的一种新的 I/O 处理方式,它提供了一种不同于传统 Java IO 的操作模式。NIO 的核心组件包括 Channel(通道)、...
### Java NIO (New IO) 详解 #### 1. 引言 在Java的世界里,I/O(Input/Output)操作是程序与外部环境进行交互的重要方式之一。随着技术的发展,传统I/O模型逐渐显露出一些局限性,特别是在处理高并发场景下,其...
- **FileChannel**:用于文件的读写操作。 - **DatagramChannel**:用于UDP数据报的发送和接收。 - **SocketChannel**:用于客户端TCP连接的读写操作。 - **ServerSocketChannel**:用于监听并接受客户端的TCP...
### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...