©
本文档使用
php.cn手册 发布
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.FileChannel
public abstract class FileChannel
用于读取、写入、映射和操作文件的通道。
文件通道在其文件中有一个当前 position,可对其进行
查询
和
修改
。该文件本身包含一个可读写的长度可变的字节序列,并且可以查询该文件的当前
大小
。写入的字节超出文件的当前大小时,则增加文件的大小;
截取
该文件时,则减小文件的大小。文件可能还有某个相关联的元数据,如访问权限、内容类型和最后的修改时间;此类未定义访问元数据的方法。
除了字节通道中常见的读取、写入和关闭操作外,此类还定义了下列特定于文件的操作:
以不影响通道当前位置的方式,对文件中绝对位置的字节进行
读取
或
写入
。
将文件中的某个区域直接
映射
到内存中;对于较大的文件,这通常比调用普通的 read 或 write 方法更为高效。
强制
对底层存储设备进行文件的更新,确保在系统崩溃时不丢失数据。
以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到
某个其他通道
中,
反之亦然
。
可以
锁定
某个文件区域,以阻止其他程序对其进行访问。
多个并发线程可安全地使用文件通道。可随时调用关闭
方法,正如 Channel
接口中所指定的。对于涉及通道位置或者可以更改其文件大小的操作,在任意给定时间只能进行一个这样的操作;如果尝试在第一个操作仍在进行时发起第二个操作,则会导致在第一个操作完成之前阻塞第二个操作。可以并发处理其他操作,特别是那些采用显式位置的操作;但是否并发处理则取决于基础实现,因此是未指定的。
确保此类的实例所提供的文件视图与同一程序中其他实例所提供的相同文件视图是一致的。但是,此类的实例所提供的视图不一定与其他并发运行的程序所看到的视图一致,这取决于底层操作系统所执行的缓冲策略和各种网络文件系统协议所引入的延迟。不管其他程序是以何种语言编写的,而且也不管是运行在相同机器还是不同机器上都是如此。此种不一致的确切性质取决于系统,因此是未指定的。
此类没有定义打开现有文件或创建新文件的方法,以后的版本中可能添加这些方法。在此版本中,可从现有的 FileInputStream
、FileOutputStream
或 RandomAccessFile
对象获得文件通道,方法是调用该对象的 getChannel 方法,这会返回一个连接到相同底层文件的文件通道。
文件通道的状态与其 getChannel 返回该通道的对象密切相关。显式或者通过读取或写入字节来更改通道的位置将更改发起对象的文件位置,反之亦然。通过文件通道更改此文件的长度将更改通过发起对象看到的长度,反之亦然。通过写入字节更改此文件的内容将更改发起对象所看到的内容,反之亦然。
此类在各种情况下指定要求“允许读取操作”、“允许写入操作”或“允许读取和写入操作”的某个实例。通过 如果从文件输出流中获得了允许进行写入操作的文件通道,并且该输出流是通过调用
FileInputStream
实例的 getChannel
方法所获得的通道将允许进行读取操作。通过 FileOutputStream
实例的 getChannel
方法所获得的通道将允许进行写入操作。最后,如果使用模式 "r" 创建 RandomAccessFile
实例,则通过该实例的 getChannel
方法所获得的通道将允许进行读取操作,如果使用模式 "rw" 创建实例,则获得的通道将允许进行读取和写入操作。
FileOutputStream(File,boolean)
构造方法且为第二个参数传入 true 来创建的,则该文件通道可能处于添加模式。在此模式中,每次调用相关的写入操作都会首先将位置移到文件的末尾,然后再写入请求的数据。在单个原子操作中是否移动位置和写入数据是与系统相关的,因此是未指定的。
FileInputStream.getChannel()
,
FileOutputStream.getChannel()
,
RandomAccessFile.getChannel()
嵌套类摘要 | |
---|---|
static class |
FileChannel.MapMode
文件映射模式的类型安全的枚举。 |
构造方法摘要 | |
---|---|
protected |
FileChannel()
初始化此类的一个新实例。 |
方法摘要 | |
---|---|
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)
将此通道的文件区域直接映射到内存中。 |
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)
从给定的文件位置开始,将字节序列从给定缓冲区写入此通道。 |
从类 java.nio.channels.spi.AbstractInterruptibleChannel 继承的方法 |
---|
begin, close, end, implCloseChannel, isOpen |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
从接口 java.nio.channels.Channel 继承的方法 |
---|
close, isOpen |
构造方法详细信息 |
---|
protected FileChannel()
方法详细信息 |
---|
public abstract int read(ByteBuffer dst) throws IOException
从此通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新该文件位置。否则此方法的行为与 ReadableByteChannel
接口中指定的行为完全相同。
ReadableByteChannel
中的 read
dst
- 要向其中传输字节的缓冲区
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
从此通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新该文件位置。否则此方法的行为与 ScatteringByteChannel
接口中指定的行为完全相同。
ScatteringByteChannel
中的 read
dsts
- 要向其中传输字节的缓冲区offset
- 第一个缓冲区(字节传输到该缓冲区中)在缓冲区数组中的偏移量;必须为非负数并且不能大于 dsts.lengthlength
- 要访问的最大缓冲区数;必须为非负数并且不能大于 dsts.length - offset
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误public final long read(ByteBuffer[] dsts) throws IOException
从此通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新该文件位置。否则此方法的行为与 ScatteringByteChannel
接口中指定的行为完全相同。
ScatteringByteChannel
中的 read
dsts
- 要向其中传输字节的缓冲区
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误public abstract int write(ByteBuffer src) throws IOException
从此通道的当前文件位置开始写入字节,但是如果该通道处于添加模式,则首先将该位置移到文件的末尾。如有必要,可以扩大文件以容纳写入的字节,然后使用实际写入的字节数更新该文件位置。否则此方法的行为与 WritableByteChannel
接口所指定的行为完全相同。
WritableByteChannel
中的 write
src
- 要从中获取字节的缓冲区
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException
- 如果发生其他 I/O 错误public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
从此通道的当前文件位置开始写入字节,但是如果该通道处于添加模式,则首先将位置移到文件的末尾。如有必要,可以扩大文件以容纳写入的字节,然后使用实际写入的字节数更新该文件位置。否则此方法的行为与 GatheringByteChannel
接口中指定的行为完全相同。
GatheringByteChannel
中的 write
offset
- 第一个缓冲区(要获取该缓冲区中的字节)在缓冲区数组中的偏移量;必须为非负数并且不能大于 srcs.lengthlength
- 要访问的最大缓冲区数;必须为非负数并且不能大于 srcs.length - offset
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException
- 如果发生其他 I/O 错误public final long write(ByteBuffer[] srcs) throws IOException
从此通道的当前文件位置开始写入字节,但是如果该通道处于添加模式,则首先将位置移到文件的末尾。如有必要,可以扩大文件以容纳写入的字节,然后使用实际写入的字节数更新该文件位置。否则此方法的行为与 GatheringByteChannel
接口中指定的行为完全相同。
GatheringByteChannel
中的 write
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException
- 如果发生其他 I/O 错误public abstract long position() throws IOException
ClosedChannelException
- 如果此通道已关闭
IOException
- 如果发生其他 I/O 错误public abstract FileChannel position(long newPosition) throws IOException
将该位置设置为大于文件当前大小的值是合法的,但这不会更改文件的大小。稍后试图在这样的位置读取字节将立即返回已到达文件末尾的指示。稍后试图在这种位置写入字节将导致文件扩大,以容纳新的字节;在以前文件末尾和新写入字节之间的字节值是未指定的。
newPosition
- 新位置,这是一个非负整数,它计算从文件开始的字节数
ClosedChannelException
- 如果此通道已关闭
IllegalArgumentException
- 如果 newPosition 为负
IOException
- 如果发生其他 I/O 错误public abstract long size() throws IOException
ClosedChannelException
- 如果此通道已关闭
IOException
- 如果发生其他 I/O 错误public abstract FileChannel truncate(long size) throws IOException
如果给定大小小于该文件的当前大小,则截取该文件,丢弃文件新末尾后面的所有字节。如果给定大小大于等于该文件的当前大小,则不修改文件。无论是哪种情况,如果此通道的文件位置大于给定大小,则将位置设置为该大小。
size
- 新的大小,非负的字节计数
NonWritableChannelException
- 如果不允许对此通道进行写入操作
ClosedChannelException
- 如果此通道已关闭
IllegalArgumentException
- 如果新的 size 为负
IOException
- 如果发生其他 I/O 错误public abstract void force(boolean metaData) throws IOException
如果此通道的文件驻留在本地存储设备上,则此方法返回时可保证:在此通道创建后或在最后一次调用此方法后对该文件进行的所有更改都已写入该设备中。这对确保在系统崩溃时不会丢失重要信息特别有用。
如果该文件不在本地设备上,则无法提供这样的保证。
metaData 参数可用于限制此方法必需执行的 I/O 操作数量。为此参数传入 false 指示只需将对文件内容的更新写入存储设备;传入 true 则指示必须写入对文件内容和元数据的更新,这通常需要一个以上的 I/O 操作。此参数是否实际有效取决于底层操作系统,因此是未指定的。
调用此方法可能导致发生 I/O 操作,即使该通道仅允许进行读取操作时也是如此。例如,某些操作系统将最后一次访问的时间作为元数据的一部分进行维护,每当读取文件时就更新此时间。实际是否执行操作是与操作系统相关的,因此是未指定的。
此方法只保证强制进行通过此类中已定义的方法对此通道的文件所进行的更改。此方法不一定强制进行那些通过修改
已映射字节缓冲区
(通过调用
map
方法获得)的内容所进行的更改。调用已映射字节缓冲区的 force
方法将强行对要写入缓冲区的内容进行更改。
metaData
- 如果为 true,则需要此方法强制对要写入存储设备的文件内容和元数据进行更改;否则只需强行写入内容更改
ClosedChannelException
- 如果此通道已关闭
IOException
- 如果发生其他 I/O 错误public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException
试图读取从此通道的文件中给定 position 处开始的 count 个字节,并将其写入目标通道。此方法的调用不一定传输所有请求的字节;是否传输取决于通道的性质和状态。如果此通道的文件从给定的 position 处开始所包含的字节数小于 count 个字节,或者如果目标通道是非阻塞的并且其输出缓冲区中的自由空间少于 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 个字节,或者如果源通道是非阻塞的并且其输入缓冲区中直接可用的空间小于 count 个字节,则所传输的字节数要小于请求的字节数。
此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则不传输任何字节。如果该位置在源通道中,则从该位置开始读取各字节,然后将该位置增加读取的字节数。
与从源通道读取并将内容写入此通道的简单循环语句相比,此方法可能高效得多。很多操作系统可将字节直接从源通道传输到文件系统缓存,而无需实际复制各字节。
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
- 如果 position 为负
NonReadableChannelException
- 如果不允许从此通道进行读取操作
ClosedChannelException
- 如果此通道已关闭
AsynchronousCloseException
- 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException
- 如果发生其他 I/O 错误public abstract int write(ByteBuffer src, long position) throws IOException
除了从给定的文件位置开始写入各字节,而不是从该通道的当前位置外,此方法的执行方式与 write(ByteBuffer)
方法相同。此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则该文件将扩大以容纳新的字节;在以前文件末尾和新写入字节之间的字节值是未指定的。
src
- 要传输其中字节的缓冲区position
- 开始传输的文件位置;必须为非负数
IllegalArgumentException
- 如果 position 为负
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
)
对于只读映射关系,此通道必须可以进行读取操作;对于读取/写入或专用映射关系,此通道必须可以进行读取和写入操作。
此方法返回的
已映射字节缓冲区
具有的位置为零,限制和容量为 size;其标记是不确定的。在缓冲区本身被作为垃圾回收之前,该缓冲区及其表示的映射关系都是有效的。
映射关系一经创建,就不再依赖于创建它时所用的文件通道。特别是关闭该通道对映射关系的有效性没有任何影响。
很多内存映射文件的细节从根本上是取决于底层操作系统的,因此是未指定的。当所请求的区域没有完全包含在此通道的文件中时,此方法的行为是未指定的。未指定是否将此程序或另一个程序对底层文件的内容或大小所进行的更改传播到缓冲区。未指定将对缓冲区的更改传播到文件的频率。
对于大多数操作系统而言,与通过普通的 read
和 write
方法读取或写入数千字节的数据相比,将文件映射到内存中开销更大。从性能的观点来看,通常将相对较大的文件映射到内存中才是值得的。
mode
- 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannel.MapMode
类中所定义的 READ_ONLY
、READ_WRITE
或 PRIVATE
之一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
调用此方法的形式为 fc.lock(), 该调用与以下调用完全相同:
fc.lock
(0L, Long.MAX_VALUE, false)
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
调用此方法的形式为 fc.tryLock(), 该调用与以下调用完全相同:
fc.tryLock
(0L, Long.MAX_VALUE, false)
ClosedChannelException
- 如果此通道已关闭
OverlappingFileLockException
- 如果此 Java 虚拟机已经持有与所请求区域重叠的锁定,或者如果另一个线程已阻塞于此方法中并且正在试图锁定一个重叠区域
IOException
- 如果发生其他 I/O 错误lock()
,
lock(long,long,boolean)
,
tryLock(long,long,boolean)
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。