public abstract class FileChannel extends AbstractInterruptibleChannel implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel
的文件信道是SeekableByteChannel
,其连接到一个文件。 它的文件中有一个当前位置 ,可以是queried
和modified
。 该文件本身包含一个可变长度的字节序列,可以被读取和写入,并且可以查询其当前的size
。 当字节写入超过其当前大小时,文件的大小会增加; 当文件大小为truncated
时,文件的大小会减小 。 该文件还可以具有一些关联的元数据 ,例如访问权限,内容类型和最后修改时间; 这个类没有定义元数据访问的方法。
除了熟悉的字节通道的读,写和关闭操作外,此类定义了以下特定于文件的操作:
一个文件的区域可能是mapped
直接进入内存; 对于大文件,这通常比调用通常的read或write方法更有效。
对文件进行的更新可能是底层存储设备的forced out
,确保在系统崩溃时数据不会丢失。
字节可以从文件to some other channel
和vice versa
传输 ,可以由许多操作系统优化到非常快速的文件系统高速缓存传输。
文件的区域可能是其他程序访问的locked
。
文件通道可以安全使用多个并发线程。 close
方法可以随时调用,由Channel
接口指定。 任何涉及频道的位置或可以更改文件大小的操作只能在任何给定的时间进行; 当第一个仍在进行时尝试启动第二个此类操作将阻止,直到第一个操作完成。 其他行动,特别是那些采取明确立场的行为,可以同时进行; 它们是否实际上依赖于潜在的实现,因此是未指定的。
由该类的实例提供的文件的视图保证与同一程序中其他实例提供的同一文件的其他视图一致。 但是,由于这个类的一个实例提供的视图可能与也可能不一致,这是由于由底层操作系统执行的缓存和由网络文件系统协议引起的延迟而由其他同时运行的程序所看到的。 无论这些其他程序的编写语言如何,以及它们是在同一台机器还是在其他机器上运行,都是如此。 任何这种不一致的确切性质是系统依赖性的,因此是未指定的。
通过调用此类定义的open
方法之一创建文件通道。 的文件信道也可以从现有的获得FileInputStream
, FileOutputStream
,或RandomAccessFile
对象通过调用该对象的getChannel方法,它返回被连接到相同的基本文件的文件信道。 在文件通道从现有流或随机访问文件获取的情况下,文件通道的状态与getChannel方法返回通道的对象的状态密切相关 。 更改频道的位置,无论是显式地还是通过读取或写入字节,都会改变原始对象的文件位置,反之亦然。 通过文件通道更改文件的长度将会改变通过始发对象所看到的长度,反之亦然。 通过写入字节来更改文件的内容将会改变原始对象所看到的内容,反之亦然。
在这个类中,这个类指定一个“开放阅读”,“开放写作”或“开放阅读和写作”的实例是必需的。 通过88417600971309实例的getChannel
方法获得的频道将被开放供阅读。 通过FileOutputStream
实例的getChannel
方法获得的通道将开放供书写。 最后,通过所获得的信道getChannel
一个的方法RandomAccessFile
实例将是开放的,如果该实例用模式"r"创建和将开放阅读和如果该实例用模式"rw"创建写入读取。
即打开用于写入的文件的信道可以是在附加模式下 ,例如,如果它是从由调用创建的文件输出流获得FileOutputStream(File,boolean)
构造和传递true用于第二参数。 在该模式中,相对写入操作的每次调用首先将位置前进到文件的末尾,然后写入所请求的数据。 在单一原子操作中是否提升位置和写入数据是依赖于系统的,因此是未指定的。
FileInputStream.getChannel()
,
FileOutputStream.getChannel()
,
RandomAccessFile.getChannel()
Modifier and Type | Class and Description |
---|---|
static class |
FileChannel.MapMode
文件映射模式的类型安全枚举。
|
Modifier | Constructor and Description |
---|---|
protected |
FileChannel()
初始化此类的新实例。
|
Modifier and Type | Method and Description |
---|---|
abstract void |
force(boolean metaData)
强制将此通道文件的任何更新写入包含该通道的存储设备。
|
FileLock |
lock()
获取此通道文件的排他锁。
|
abstract FileLock |
lock(long position, long size, boolean shared)
获取此通道文件的给定区域的锁定。
|
abstract MappedByteBuffer |
map(FileChannel.MapMode mode, long position, long size)
将此频道文件的区域直接映射到内存中。
|
static FileChannel |
open(Path path, OpenOption... options)
打开或创建文件,返回文件通道以访问该文件。
|
static FileChannel |
open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs)
打开或创建文件,返回文件通道以访问该文件。
|
abstract long |
position()
返回此频道的文件位置。
|
abstract FileChannel |
position(long newPosition)
设置此通道的文件位置。
|
abstract int |
read(ByteBuffer dst)
从该通道读取到给定缓冲区的字节序列。
|
long |
read(ByteBuffer[] dsts)
从该通道读取到给定缓冲区的字节序列。
|
abstract long |
read(ByteBuffer[] dsts, int offset, int length)
从该通道读取字节序列到给定缓冲区的子序列中。
|
abstract int |
read(ByteBuffer dst, long position)
从给定的文件位置开始,从该通道读取一个字节序列到给定的缓冲区。
|
abstract long |
size()
返回此通道文件的当前大小。
|
abstract long |
transferFrom(ReadableByteChannel src, long position, long count)
从给定的可读字节通道将字节传输到该通道的文件中。
|
abstract long |
transferTo(long position, long count, WritableByteChannel target)
将该通道文件的字节传输到给定的可写字节通道。
|
abstract FileChannel |
truncate(long size)
将此频道的文件截断为给定大小。
|
FileLock |
tryLock()
尝试获取此频道文件的排他锁。
|
abstract FileLock |
tryLock(long position, long size, boolean shared)
尝试获取此通道文件的给定区域的锁定。
|
abstract int |
write(ByteBuffer src)
从给定的缓冲区向该通道写入一个字节序列。
|
long |
write(ByteBuffer[] srcs)
从给定的缓冲区向该通道写入一系列字节。
|
abstract long |
write(ByteBuffer[] srcs, int offset, int length)
从给定缓冲区的子序列将一个字节序列写入该通道。
|
abstract int |
write(ByteBuffer src, long position)
从给定的缓冲区向给定的文件位置开始,向该通道写入一个字节序列。
|
begin, close, end, implCloseChannel, isOpen
public static FileChannel open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException
options
参数确定文件的打开方式。 READ
和WRITE
选项确定文件是否应被打开用于读取和/或写入。 如果数组中没有包含选项(或APPEND
选项),则打开文件进行阅读。 默认情况下,文件开始时开始读写。
除了READ
和WRITE
,还可能存在以下选项:
APPEND
If this option is present then the file is opened for writing and each invocation of the channel's write
method first advances the position to the end of the file and then writes the requested data. Whether the advancement of the position and the writing of the data are done in a single atomic operation is system-dependent and therefore unspecified. This option may not be used in conjunction with the READ
or TRUNCATE_EXISTING
options. TRUNCATE_EXISTING
If this option is present then the existing file is truncated to a size of 0 bytes. This option is ignored when the file is opened only for reading. CREATE_NEW
If this option is present then a new file is created, failing if the file already exists. When creating a file the check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations. This option is ignored when the file is opened only for reading. CREATE
If this option is present then an existing file is opened if it exists, otherwise a new file is created. When creating a file the check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations. This option is ignored if the CREATE_NEW
option is also present or the file is opened only for reading. DELETE_ON_CLOSE
When this option is present then the implementation makes a best effort attempt to delete the file when closed by the the close
method. If the close
method is not invoked then a best effort attempt is made to delete the file when the Java virtual machine terminates. SPARSE
When creating a new file this option is a hint that the new file will be sparse. This option is ignored when not creating a new file. SYNC
Requires that every update to the file's content or metadata be written synchronously to the underlying storage device. (see Synchronized I/O file integrity). DSYNC
Requires that every update to the file's content be written synchronously to the underlying storage device. (see Synchronized I/O file integrity).
实施还可以支持其他选项。
attrs
参数是文件file-attributes
的可选数组,用于在创建文件时以原子方式进行设置。
新的信道是通过调用创建newFileChannel
上创建该提供商方法Path
。
path
- 打开或创建文件的路径
options
- 指定文件打开方式的选项
attrs
- 创建文件时以原子方式设置的文件属性的可选列表
IllegalArgumentException
- 如果集合包含无效的选项组合
UnsupportedOperationException
-如果
path
已与不支持创建文件信道,或不支持的打开选项提供商相关联的指定,或阵列包含可以在创建文件时不被原子地设置一个属性
IOException
- 如果发生I / O错误
SecurityException
- 如果安装了一个安全管理器,并且拒绝执行所需的未指定的权限。
在默认提供程序的情况下,如果打开文件进行阅读,则调用SecurityManager.checkRead(String)
方法来检查读取访问。
如果文件被打开以写入,则调用SecurityManager.checkWrite(String)
方法来检查写访问
public static FileChannel open(Path path, OpenOption... options) throws IOException
调用此方法的行为方式与调用完全相同
fc.open
(file, opts, new FileAttribute<?>[0]);
其中opts
是一组在options
数组中指定的选项。
path
- 打开或创建文件的路径
options
- 指定文件打开方式的选项
IllegalArgumentException
- 如果集合包含无效的选项组合
UnsupportedOperationException
-如果
path
与不支持创建文件通道的提供者,或者不支持的开放式选项关联指定
IOException
- 如果发生I / O错误
SecurityException
- 如果安装了一个安全管理器,并且拒绝执行所需的未指定的权限。
在默认提供程序的情况下,如果打开文件进行阅读,则调用SecurityManager.checkRead(String)
方法来检查读取访问。
如果打开文件写入,则调用SecurityManager.checkWrite(String)
方法来检查写访问
public abstract int read(ByteBuffer dst) throws IOException
从该通道的当前文件位置开始读取字节,然后以实际读取的字节数更新文件位置。 否则,此方法的行为与ReadableByteChannel
界面中的规定完全相同。
read
在接口
ReadableByteChannel
read
在接口
SeekableByteChannel
dst
- 要传输字节的缓冲区
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
从该通道的当前文件位置开始读取字节,然后以实际读取的字节数更新文件位置。 否则,此方法的行为与ScatteringByteChannel
接口中的规定完全相同。
read
在接口
ScatteringByteChannel
dsts
- 要传输字节的缓冲区
offset
- 要传输字节的第一个缓冲区的缓冲区数组内的偏移量;
必须是非负数,不得大于dsts.length
length
- 要访问的缓冲区的最大数量;
必须是非负数,不得大于dsts.length - offset
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行中关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public final long read(ByteBuffer[] dsts) throws IOException
从该通道的当前文件位置开始读取字节,然后以实际读取的字节数更新文件位置。 否则,此方法的行为与ScatteringByteChannel
接口中的规定完全相同。
read
在接口
ScatteringByteChannel
dsts
- 要传输字节的缓冲区
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract int write(ByteBuffer src) throws IOException
字节从该通道的当前文件位置开始写入,除非通道处于附加模式,在这种情况下,位置首先提前到文件的末尾。 如果需要,文件生长以容纳写入的字节,然后文件位置用实际写入的字节数更新。 否则,此方法的行为与WritableByteChannel
接口的规定完全相同。
write
在接口
SeekableByteChannel
write
中的
WritableByteChannel
src
- 要检索字节的缓冲区
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
字节从该通道的当前文件位置开始写入,除非通道处于附加模式,在这种情况下,位置首先提前到文件的末尾。 如果需要,文件生长以容纳写入的字节,然后文件位置用实际写入的字节数更新。 否则,此方法的行为与GatheringByteChannel
界面中的规定完全相同。
write
在接口
GatheringByteChannel
srcs
- 要检索字节的缓冲区
offset
- 要从中检索字节的第一个缓冲区的缓冲区数组中的偏移量;
必须是非负数,不得大于srcs.length
length
- 要访问的缓冲区的最大数量;
必须是非负数,不得大于srcs.length - offset
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public final long write(ByteBuffer[] srcs) throws IOException
字节从该通道的当前文件位置开始写入,除非通道处于附加模式,在这种情况下,位置首先提前到文件的末尾。 如果需要,文件生长以容纳写入的字节,然后文件位置用实际写入的字节数更新。 否则,此方法的行为与GatheringByteChannel
接口中的规定完全相同。
write
在接口
GatheringByteChannel
srcs
- 要检索字节的缓冲区
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract long position() throws IOException
position
在接口
SeekableByteChannel
ClosedChannelException
- 如果此频道关闭
IOException
- 如果发生其他I / O错误
public abstract FileChannel position(long newPosition) throws IOException
将位置设置为大于文件当前大小的值是合法的,但不会更改文件的大小。 稍后在这样的位置读取字节的尝试将立即返回文件结束指示。 稍后在这样的位置写入字节的尝试将导致文件生长以适应新的字节; 未指定上一个文件结尾和新写入的字节之间的任何字节的值。
position
在接口
SeekableByteChannel
newPosition
- 新的位置,一个非负整数,从文件开始计数字节数
ClosedChannelException
- 如果此通道关闭
IllegalArgumentException
- 如果新位置为负
IOException
- 如果发生其他I / O错误
public abstract long size() throws IOException
size
中的
SeekableByteChannel
ClosedChannelException
- 如果此通道关闭
IOException
- 如果发生其他I / O错误
public abstract FileChannel truncate(long size) throws IOException
如果给定的大小小于文件的当前大小,则文件将被截断,丢弃超出文件新端的任何字节。 如果给定的大小大于或等于文件的当前大小,则该文件不会被修改。 在任一情况下,如果此通道的文件位置大于给定大小,则将其设置为该大小。
truncate
在接口
SeekableByteChannel
size
- 新的大小,非负字节数
NonWritableChannelException
- 如果此通道未打开以进行写入
ClosedChannelException
- 如果此通道关闭
IllegalArgumentException
- 如果新尺寸为负
IOException
- 如果发生其他I / O错误
public abstract void force(boolean metaData) throws IOException
如果此通道的文件驻留在本地存储设备上,那么当该方法返回时,将保证自创建该通道以来创建的该文件所做的所有更改,或自上次调用该方法以来,都将写入该设备。 这对于确保系统崩溃时不会丢失关键信息非常有用。
如果文件不在本地设备上,则不会提供此类保证。
metaData参数可用于限制此方法执行所需的I / O操作数。 为此参数传入false表示只更新文件的内容需要被写入存储设备; 通过true表示必须写入文件的内容和元数据的更新,这通常需要至少一个I / O操作。 该参数实际上是否具有任何效果取决于底层操作系统,因此未指定。
调用此方法可能会导致I / O操作发生,即使通道仅打开读取。 例如,某些操作系统将最后访问时间作为文件的元数据的一部分进行维护,并且每次读取文件时都会更新此时间。 这是否实际上是系统依赖的,因此是未指定的。
此方法只能通过此类中定义的方法强制对此通道文件进行的更改。 它可以或可以不强制通过修改一个的内容所做的更改mapped byte buffer
通过调用获得map
方法。 调用映射字节缓冲区的force
方法将强制对缓冲区内容的更改进行写入。
metaData
- 如果true那么需要这种方法来强制更改文件的内容和要写入存储的元数据;
否则,它只需要强制更改内容
ClosedChannelException
- 如果此通道关闭
IOException
- 如果发生其他I / O错误
public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException
尝试从该通道文件中的给定position开始读取最多count个字节,并将其写入目标通道。 此方法的调用可能会传送或不传送所有请求的字节; 是否这样做取决于渠道的性质和状态。 如果该通道的文件包含少于count个字节,从给定的position开始,或者如果目标通道是非阻塞的,并且在其输出缓冲区中有少于count个字节的空闲, 那么传输的字节数将少于所请求的字节数。
此方法不会修改此频道的位置。 如果给定的位置大于文件的当前大小,则不会传输任何字节。 如果目标通道具有位置,则从该位置开始写入字节,然后将该位置递增写入的字节数。
该方法比从该通道读取并写入目标通道的简单循环更有效。 许多操作系统可以将字节直接从文件系统缓存传输到目标通道,而无需实际复制它们。
position
- 传输开始的文件中的位置;
必须是非负的
count
- 要传输的最大字节数;
必须是非负的
target
- 目标频道
IllegalArgumentException
- 如果参数的前提条件不成立
NonReadableChannelException
- 如果这个频道没有打开阅读
NonWritableChannelException
- 如果目标通道未打开以进行写入
ClosedChannelException
- 如果此通道或目标通道关闭
AsynchronousCloseException
- 如果另一个线程在传输过程中关闭任一通道
ClosedByInterruptException
- 如果另一个线程在传输过程中中断当前线程,从而关闭两个通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract long transferFrom(ReadableByteChannel src, long position, long count) throws IOException
尝试从源通道读取count个字节,并将其写入此通道的文件,从给定的position开始。 此方法的调用可能会传送或不传送所有请求的字节; 是否这样做取决于渠道的性质和状态。 如果源通道剩余少于count个字节,或者源通道为非阻塞,并且其输入缓冲区中立即可用的字节少于8841760419806字节,则将少于所请求的字节数。
此方法不会修改此频道的位置。 如果给定的位置大于文件的当前大小,则不会传输任何字节。 如果源通道具有位置,则从该位置开始读取字节,然后将该位置递增读取的字节数。
该方法比从源通道读取并写入此通道的简单循环可能更有效。 许多操作系统可以将字节直接从源通道传输到文件系统高速缓存中,而无需实际复制它们。
src
- 源频道
position
- 传输开始的文件中的位置;
必须是非负的
count
- 要传输的最大字节数;
必须是非负的
IllegalArgumentException
- 如果参数的前提条件不成立
NonReadableChannelException
- 如果源通道未打开读取
NonWritableChannelException
- 如果此通道未打开以进行写入
ClosedChannelException
- 如果此通道或源通道关闭
AsynchronousCloseException
- 如果另一个线程在传输过程中关闭任一通道
ClosedByInterruptException
- 如果另一个线程在传输过程中中断当前线程,从而关闭两个通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract int read(ByteBuffer dst, long position) throws IOException
该方法的工作原理与read(ByteBuffer)
方法相同,只是从给定文件位置而不是在通道的当前位置开始读取字节。 此方法不会修改此频道的位置。 如果给定的位置大于文件的当前大小,则不会读取任何字节。
dst
- 要传输字节的缓冲区
position
- 传输开始的文件位置;
必须是非负的
IllegalArgumentException
- 如果位置为负
NonReadableChannelException
- 如果此频道未打开阅读
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在读取操作正在进行中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract int write(ByteBuffer src, long position) throws IOException
该方法的工作方式与write(ByteBuffer)
方法相同,只是字节从给定的文件位置而不是在通道的当前位置写入。 此方法不会修改此频道的位置。 如果给定的位置大于文件的当前大小,那么该文件将被生长以适应新的字节; 未指定上一个文件结尾和新写入的字节之间的任何字节的值。
src
- 要传输字节的缓冲区
position
- 传输开始的文件位置;
必须是非负的
IllegalArgumentException
- 如果位置为负
NonWritableChannelException
- 如果这个频道没有开放写作
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
IOException
- 如果发生其他I / O错误
public abstract MappedByteBuffer map(FileChannel.MapMode mode, long position, long size) throws IOException
文件的区域可以以三种模式之一映射到存储器中:
只读:任何尝试修改生成的缓冲区将导致抛出ReadOnlyBufferException
。 ( MapMode.READ_ONLY
)
读/写:对结果缓冲区所做的更改将最终传播到文件中; 它们可能也可能不会被映射到同一文件的其他程序可见。 ( MapMode.READ_WRITE
)
私有:对结果缓冲区所做的更改不会传播到该文件,并且对于映射了相同文件的其他程序将不可见; 相反,它们将导致要创建的缓冲区的修改部分的私有副本。 ( MapMode.PRIVATE
)
对于只读映射,此通道必须已打开才能读取; 对于读/写或私有映射,此通道必须已被打开以供读写。
该方法返回的mapped byte buffer
的位置为零,容量为size ; 它的标记将是未定义的。 缓冲区及其表示的映射将保持有效,直到缓冲区本身被垃圾回收为止。
映射一旦建立,就不依赖于用于创建它的文件通道。 关闭通道,特别是对映射的有效性没有影响。
内存映射文件的许多细节固有地依赖于底层操作系统,因此是未指定的。 当请求的区域未完全包含在该通道的文件中时,此方法的行为是未指定的。 对该程序或另一个的底层文件的内容或大小进行的更改是否被传播到缓冲区是未指定的。 缓冲区的更改传播到文件的速率是未指定的。
对于大多数操作系统,将文件映射到内存中比通过通常的read
和write
方法读取或写入几十千字节的数据更 昂贵 。 从性能的角度来看,通常只能将较大的文件映射到内存中。
mode
-一个常量READ_ONLY
, READ_WRITE
,或PRIVATE
在所定义FileChannel.MapMode
类,根据该文件是否是要被映射的只读,读/写,或私人(写入时复制),分别
position
- 映射区域要启动的文件中的位置;
必须是非负的
size
- 要映射的区域的大小;
必须是非负数,不得大于Integer.MAX_VALUE
NonReadableChannelException
- 如果
mode是
READ_ONLY
但是这个频道没有打开阅读
NonWritableChannelException
- 如果
mode是
READ_WRITE
或
PRIVATE
,但这个频道没有打开读写
IllegalArgumentException
- 如果参数的前提条件不成立
IOException
- 如果发生其他I / O错误
FileChannel.MapMode
, MappedByteBuffer
public abstract FileLock lock(long position, long size, boolean shared) throws IOException
此方法的调用将阻塞,直到该区域被锁定,此通道关闭或调用的线程被中断(以先到者为准)。
如果此通道在调用此方法期间由另一个线程关闭,则将抛出AsynchronousCloseException
。
如果在等待获取锁定的情况下调用线程中断,则其中断状态将被设置,并且将抛出一个FileLockInterruptionException
。 如果在调用此方法时调用了调用者的中断状态,那么将立即抛出该异常; 线程的中断状态不会改变。
由position和size参数指定的区域不需要包含在实际的底层文件内,甚至与实际的底层文件重叠。 锁定区域的大小固定; 如果锁定区域最初包含文件的结尾,并且文件增长超出该区域,那么该文件的新部分将不会被该锁覆盖。 如果文件的大小增加,并且整个文件都需要锁定,则应该锁定从零开始并且不小于文件的预期最大大小的区域。 零参数lock()
方法简单地锁定一个大小为Long.MAX_VALUE
的区域。
某些操作系统不支持共享锁,在这种情况下,共享锁的请求将自动转换为独占锁的请求。 新获取的锁是共享的还是独占的可以通过调用生成的锁定对象的isShared
方法来测试。
文件锁代表整个Java虚拟机。 它们不适用于通过同一虚拟机中的多个线程来控制对文件的访问。
position
- 锁定区域要启动的位置;
必须是非负的
size
- 锁定区域的大小;
必须是非负数,并且总和position + size必须是非负数
shared
- true请求共享锁,在这种情况下,该通道必须打开才能读取(可能写入);
false要求一个独占锁,在这种情况下,这个通道必须是开放的写(和可能阅读)
IllegalArgumentException
- 如果参数的前提条件不成立
ClosedChannelException
- 如果此频道关闭
AsynchronousCloseException
- 如果另一个线程在此方法中阻止调用线程时关闭此通道
FileLockInterruptionException
- 如果调用线程在此方法中被阻止时中断
OverlappingFileLockException
- 如果与该请求区域重叠的锁已由该Java虚拟机保存,或者该方法中已阻止另一个线程,并尝试锁定重叠区域
NonReadableChannelException
- 如果
shared是
true这个频道没有打开阅读
NonWritableChannelException
- 如果
shared是
false但是这个频道没有开放写作
IOException
- 如果发生其他I / O错误
lock()
,
tryLock()
,
tryLock(long,long,boolean)
public final FileLock lock() throws IOException
ClosedChannelException
- 如果此通道关闭
AsynchronousCloseException
- 如果另一个线程在此方法中阻止调用线程时关闭此通道
FileLockInterruptionException
- 如果调用线程在此方法中被阻塞时中断
OverlappingFileLockException
- 如果与该请求区域重叠的锁已由该Java虚拟机保留,或者该方法中已经阻止了另一个线程,并尝试锁定同一文件的重叠区域
NonWritableChannelException
- 如果这个频道没有开放写作
IOException
- 如果发生其他I / O错误
lock(long,long,boolean)
,
tryLock()
,
tryLock(long,long,boolean)
public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException
此方法不阻止。 调用总是立即返回,要么获取了请求的区域的锁定,要么没有这样做。 如果由于重叠的锁被另一个程序持有而无法获取锁,则返回null 。 如果由于任何其他原因无法获取锁,则抛出适当的异常。
由position和size参数指定的区域不需要包含在实际的底层文件内,甚至与实际的底层文件重叠。 锁定区域的大小固定; 如果锁定区域最初包含文件的结尾,并且文件增长超出该区域,那么该文件的新部分将不会被该锁覆盖。 如果文件的大小增加,并且整个文件都需要锁定,则应该锁定从零开始并且不小于文件的预期最大大小的区域。 零参数tryLock()
方法简单地锁定一个大小为Long.MAX_VALUE
的区域。
某些操作系统不支持共享锁,在这种情况下,共享锁的请求将自动转换为独占锁的请求。 新获取的锁是共享的还是独占的都可以通过调用生成的锁定对象的isShared
方法进行测试。
文件锁代表整个Java虚拟机。 它们不适用于通过同一虚拟机中的多个线程来控制对文件的访问。
position
- 锁定区域要启动的位置;
必须是非负的
size
- 锁定区域的大小;
必须是非负数,并且总和position + size必须是非负数
shared
-
true要求共享锁,
false要求排他锁
IllegalArgumentException
- 如果参数的前提条件不成立
ClosedChannelException
- 如果此频道关闭
OverlappingFileLockException
- 如果与该请求区域重叠的锁已由该Java虚拟机保留,或者该方法中已阻止另一个线程,并尝试锁定同一文件的重叠区域
IOException
- 如果发生其他I / O错误
lock()
,
lock(long,long,boolean)
,
tryLock()
public final FileLock tryLock() throws IOException
ClosedChannelException
- 如果此通道关闭
OverlappingFileLockException
- 如果与该请求区域重叠的锁已由该Java虚拟机保留,或者该方法中是否已阻止另一个线程,并尝试锁定重叠区域
IOException
- 如果发生其他I / O错误
lock()
,
lock(long,long,boolean)
,
tryLock(long,long,boolean)