JavaTM 2 Platform
Standard Ed. 5.0

java.nio.channels
类 FileChannel

java.lang.Object
  继承者 java.nio.channels.spi.AbstractInterruptibleChannel
      继承者 java.nio.channels.FileChannel
所有已实现的接口:
Closeable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class FileChannel
extends AbstractInterruptibleChannel
implements ByteChannel, GatheringByteChannel, ScatteringByteChannel

用于读取、写入、映射和操作文件的通道。

文件通道在其文件中有一个当前 position,可对其进行查询修改。该文件本身包含一个可读写的长度可变的字节序列,并且可以查询该文件的当前#size大小。写入的字节超出文件的当前大小时,则增加文件的大小;截取 该文件时,则减小文件的大小。文件可能还有某个相关联的元数据,如访问权限、内容类型和最后的修改时间;此类未定义访问元数据的方法。

除了字节通道中常见的读取、写入和关闭操作外,此类还定义了下列特定于文件的操作:

多个并发线程可安全地使用文件通道。可随时调用关闭方法,正如 Channel 接口中所指定的。对于涉及通道位置或者可以更改其文件大小的操作,在任意给定时间只能进行一个这样的操作;如果尝试在第一个操作仍在进行时发起第二个操作,则会导致在第一个操作完成之前阻塞第二个操作。可以并发处理其他操作,特别是那些采用显式位置的操作;但是否并发处理则取决于基础实现,因此是未指定的。

确保此类的实例所提供的文件视图与同一程序中其他实例所提供的相同文件视图是一致的。但是,此类的实例所提供的视图不一定与其他并发运行的程序所看到的视图一致,这取决于基础操作系统所执行的缓冲策略和各种网络文件系统协议所引入的延迟。不管其他程序是以何种语言编写的,而且也不管是运行在相同机器还是不同机器上都是如此。此种不一致的确切性质取决于系统,因此是未指定的。

此类没有定义打开现有文件或创建新文件的方法,以后的版本中可能添加这些方法。在此版本中,可从现有的 FileInputStreamFileOutputStreamRandomAccessFile 对象获得文件通道,方法是调用该对象的 getChannel 方法,这会返回一个连接到相同基础文件的文件通道。

文件通道的状态与其 getChannel 返回该通道的对象密切相关。显式或者通过读取或写入字节来更改通道的位置将更改发起对象的文件位置,反之亦然。通过文件通道更改此文件的长度将更改通过发起对象看到的长度,反之亦然。通过写入字节更改此文件的内容将更改发起对象所看到的内容,反之亦然。

此类在各种情况下指定要求“允许读取操作”、“允许写入操作”或“允许读取和写入操作”的某个实例。通过 FileInputStream 实例的 getChannel 方法所获得的通道将允许进行读取操作。通过 FileOutputStream 实例的 getChannel 方法所获得的通道将允许进行写入操作。最后,如果使用模式 "r" 创建 RandomAccessFile 实例,则通过该实例的 getChannel 方法所获得的通道将允许进行读取操作,如果使用模式 "rw" 创建实例,则获得的通道将允许进行读取和写入操作。

如果从文件输出流中获得了允许进行写入操作的文件通道,并且该输出流是通过调用 FileOutputStream(File,boolean) 构造方法且为第二个参数传入 true 来创建的,则该文件通道可能处于追加模式。在此模式中,每次调用相关的写入操作都会首先将位置移到文件的末尾,然后再写入请求的数据。在单个原子操作中是否移动位置和写入数据是与系统相关的,因此是未指定的。

从以下版本开始:
1.4
另请参见:
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
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 

构造方法详细信息

FileChannel

protected FileChannel()
初始化此类的一个新实例。

方法详细信息

read

public abstract int read(ByteBuffer dst)
                  throws IOException
将字节序列从此通道读入给定的缓冲区。

从此通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新该文件位置。否则此方法的行为与 ReadableByteChannel 接口中指定的行为完全相同。

指定者:
接口 ReadableByteChannel 中的 read
参数:
dst - 要向其中传输字节的缓冲区
返回:
读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException - 如果发生其他 I/O 错误

read

public abstract long read(ByteBuffer[] dsts,
                          int offset,
                          int length)
                   throws IOException
将字节序列从此通道读入给定缓冲区的子序列中。

从此通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新该文件位置。否则此方法的行为与 ScatteringByteChannel 接口中指定的行为完全相同。

指定者:
接口 ScatteringByteChannel 中的 read
参数:
dsts - 要向其中传输字节的缓冲区
offset - 第一个缓冲区(字节传输到该缓冲区中)在缓冲区数组中的偏移量;必须为非负数并且不能大于 dsts.length
length - 要访问的最大缓冲区数;必须为非负数并且不能大于 dsts.length - offset
返回:
读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException - 如果发生其他 I/O 错误

read

public final long read(ByteBuffer[] dsts)
                throws IOException
将字节序列从此通道读入给定的缓冲区。

从此通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新该文件位置。否则此方法的行为与 ScatteringByteChannel 接口中指定的行为完全相同。

指定者:
接口 ScatteringByteChannel 中的 read
参数:
dsts - 要向其中传输字节的缓冲区
返回:
读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException - 如果发生其他 I/O 错误

write

public abstract int write(ByteBuffer src)
                   throws IOException
将字节序列从给定的缓冲区写入此通道。

从此通道的当前文件位置开始写入字节,但是如果该通道处于追加模式,则首先将该位置移到文件的末尾。如有必要,可以扩大文件以容纳写入的字节,然后使用实际写入的字节数更新该文件位置。否则此方法的行为与 WritableByteChannel 接口所指定的行为完全相同。

指定者:
接口 WritableByteChannel 中的 write
参数:
src - 要从中检索字节的缓冲区
返回:
写入的字节数,可能为零
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误

write

public abstract long write(ByteBuffer[] srcs,
                           int offset,
                           int length)
                    throws IOException
将字节序列从给定缓冲区的子序列写入此通道。

从此通道的当前文件位置开始写入字节,但是如果该通道处于追加模式,则首先将位置移到文件的末尾。如有必要,可以扩大文件以容纳写入的字节,然后使用实际写入的字节数更新该文件位置。否则此方法的行为与 GatheringByteChannel 接口中指定的行为完全相同。

指定者:
接口 GatheringByteChannel 中的 write
offset - 第一个缓冲区(要检索该缓冲区中的字节)在缓冲区数组中的偏移量;必须为非负数并且不能大于 srcs.length
length - 要访问的最大缓冲区数;必须为非负数并且不能大于 srcs.length - offset
返回:
写入的字节数,可能为零
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误

write

public final long write(ByteBuffer[] srcs)
                 throws IOException
将字节序列从给定的缓冲区写入此通道。

从此通道的当前文件位置开始写入字节,但是如果该通道处于追加模式,则首先将位置移到文件的末尾。如有必要,可以扩大文件以容纳写入的字节,然后使用实际写入的字节数更新该文件位置。否则此方法的行为与 GatheringByteChannel 接口中指定的行为完全相同。

指定者:
接口 GatheringByteChannel 中的 write
返回:
写入的字节数,可能为零
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误

position

public abstract long position()
                       throws IOException
返回此通道的文件位置。

返回:
此通道的文件位置,这是一个非负整数,它计算从文件的开始到当前位置之间的字节数
抛出:
ClosedChannelException - 如果此通道已关闭
IOException - 如果发生其他 I/O 错误

position

public abstract FileChannel position(long newPosition)
                              throws IOException
设置此通道的文件位置。

将该位置设置为大于文件当前大小的值是合法的,但这不会更改文件的大小。稍后试图在这样的位置读取字节将立即返回已到达文件末尾的指示。稍后试图在这种位置写入字节将导致文件扩大,以容纳新的字节;在以前文件末尾和新写入字节之间的字节值是未指定的。

参数:
newPosition - 新位置,这是一个非负整数,它计算从文件开始的字节数
返回:
此文件通道
抛出:
ClosedChannelException - 如果此通道已关闭
IllegalArgumentException - 如果 newPosition 为负
IOException - 如果发生其他 I/O 错误

size

public abstract long size()
                   throws IOException
返回此通道的文件的当前大小。

返回:
此通道的文件的当前大小,以字节为单位
抛出:
ClosedChannelException - 如果此通道已关闭
IOException - 如果发生其他 I/O 错误

truncate

public abstract FileChannel truncate(long size)
                              throws IOException
将此通道的文件截取为给定大小。

如果给定大小 小于该文件的当前大小,则截取该文件,丢弃文件新末尾后面的所有字节。如果给定大小大于或等于该文件的当前大小,则不修改文件。无论是哪种情况,如果此通道的文件位置大于给定大小,则将位置设置为该大小。

参数:
size - 新的大小,非负的字节计数
返回:
此文件通道
抛出:
NonWritableChannelException - 如果不允许对此通道进行写入操作
ClosedChannelException - 如果此通道已关闭
IllegalArgumentException - 如果新的 size 为负
IOException - 如果发生其他 I/O 错误

force

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 错误

transferTo

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 错误

transferFrom

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 错误

read

public abstract int read(ByteBuffer dst,
                         long position)
                  throws IOException
从给定的文件位置开始,从此通道读取字节序列,并写入给定的缓冲区。

除了从给定的文件位置开始读取各字节,而不是从该通道的当前位置外,此方法的执行方式与 read(ByteBuffer) 方法相同。此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则不读取任何字节。

参数:
dst - 要向其中传输字节的缓冲区
position - 开始传输的文件位置;必须为非负数
返回:
读取的字节数,可能为零,如果给定的位置大于或等于该文件的当前大小,则返回 -1
抛出:
IllegalArgumentException - 如果 position 为负
NonReadableChannelException - 如果不允许从此通道进行读取操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException - 如果发生其他 I/O 错误

write

public abstract int write(ByteBuffer src,
                          long position)
                   throws IOException
从给定的文件位置开始,将字节序列从给定缓冲区写入此通道。

除了从给定的文件位置开始写入各字节,而不是从该通道的当前位置外,此方法的执行方式与 write(ByteBuffer) 方法相同。此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则该文件将扩大以容纳新的字节;在以前文件末尾和新写入字节之间的字节值是未指定的。

参数:
src - 要传输其中字节的缓冲区
position - 开始传输的文件位置;必须为非负数
返回:
写入的字节数,可能为零
抛出:
IllegalArgumentException - 如果 position 为负
NonWritableChannelException - 如果不允许对此通道进行写入操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误

map

public abstract MappedByteBuffer map(FileChannel.MapMode mode,
                                     long position,
                                     long size)
                              throws IOException
将此通道的文件区域直接映射到内存中。

可以通过下列三种模式将文件区域映射到内存中:

对于只读映射关系,此通道必须可以进行读取操作;对于读取/写入或专用映射关系,此通道必须可以进行读取和写入操作。

此方法返回的已映射字节缓冲区具有的位置为零,限制和容量为 size;其标记是不确定的。在缓冲区本身被作为垃圾回收之前,该缓冲区及其表示的映射关系都是有效的。

映射关系一经创建,就不再依赖于创建它时所用的文件通道。特别是关闭该通道对映射关系的有效性没有任何影响。

很多内存映射文件的细节从根本上是取决于基础操作系统的,因此是未指定的。当所请求的区域没有完全包含在此通道的文件中时,此方法的行为是未指定的。未指定是否将此程序或另一个程序对基础文件的内容或大小所进行的更改传播到缓冲区。未指定将对缓冲区的更改传播到文件的频率。

对于大多数操作系统而言,与通过普通的 readwrite 方法读取或写入数千字节的数据相比,将文件映射到内存中开销更大。从性能的观点来看,通常将相对较大的文件映射到内存中才是值得的。

参数:
mode - 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannel.MapMode 类中所定义的 READ_ONLYREAD_WRITEPRIVATE 之一
position - 文件中的位置,映射区域从此位置开始;必须为非负数
size - 要映射的区域大小;必须为非负数且不大于 Integer.MAX_VALUE
抛出:
NonReadableChannelException - 如果 modeREAD_ONLY,但是不允许对此通道进行读取操作
NonWritableChannelException - 如果 modeREAD_WRITEPRIVATE,但是不允许此通道进行读取和写入操作
IllegalArgumentException - 如果关于参数的前提不成立
IOException - 如果发生其他 I/O 错误
另请参见:
FileChannel.MapMode, MappedByteBuffer

lock

public abstract FileLock lock(long position,
                              long size,
                              boolean shared)
                       throws IOException
获取此通道的文件给定区域上的锁定。

在可以锁定该区域、已关闭此通道或者已中断调用线程(以先到者为准)之前,将阻塞此方法的调用。

如果在此方法调用期间另一个线程关闭了此通道,则抛出 AsynchronousCloseException

如果在等待获取锁定的同时中断了调用线程,则将状态设置为中断并抛出 FileLockInterruptionException。如果调用此方法时已设置调用方的中断状态,则立即抛出该异常;不更改该线程的中断状态。

positionsize 参数所指定的区域无需包含在实际的基础文件中,甚至无需与文件重叠。锁定区域的大小是固定的;如果某个已锁定区域最初包含整个文件,并且文件因扩大而超出了该区域,则该锁定不覆盖此文件的新部分。如果期望文件大小扩大并且要求锁定整个文件,则应该锁定从零开始,到不小于期望最大文件大小的区域。零参数的 lock() 方法只是锁定大小为 Long.MAX_VALUE 的区域。

某些操作系统不支持共享锁定,在这种情况下,自动将对共享锁定的请求转换为对独占锁定的请求。可通过调用所得锁定对象的 isShared 方法来测试新获取的锁定是共享的还是独占的。

文件锁定是以整个 Java 虚拟机来保持的。但它们不适用于控制同一虚拟机内多个线程对文件的访问。

参数:
position - 锁定区域开始的位置;必须为非负数
size - 锁定区域的大小;必须为非负数,并且 position + size 的和必须为非负数
shared - 要请求共享锁定,则为 true,在这种情况下此通道必须允许进行读取(可能是写入)操作;要请求独占锁定,则为 false,在这种情况下此通道必须允许进行写入(可能是读取)操作
返回:
一个锁定对象,表示新获取的锁定
抛出:
IllegalArgumentException - 如果关于参数的前提不成立
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果调用线程阻塞于此方法中时另一个线程关闭了此通道
FileLockInterruptionException - 如果调用线程阻塞于此方法中时被中断
OverlappingFileLockException - 如果此 Java 虚拟机已经持有与所请求区域重叠的锁定,或者如果另一个线程已阻塞于此方法中并且正在试图锁定一个重叠区域
NonReadableChannelException - 如果 sharedtrue,但此通道不允许进行读取操作
NonWritableChannelException - 如果 sharedfalse,但此通道不允许进行写入操作
IOException - 如果发生其他 I/O 错误
另请参见:
lock(), tryLock(), tryLock(long,long,boolean)

lock

public final FileLock lock()
                    throws IOException
获取对此通道的文件的独占锁定。

调用此方法的形式为 fc.lock(), 该调用与以下调用完全相同:

     fc.lock(0L, Long.MAX_VALUE, false) 

返回:
一个锁定对象,表示新获取的锁定
抛出:
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果调用线程阻塞于此方法中时另一个线程关闭了此通道
FileLockInterruptionException - 如果调用线程阻塞于此方法中时被中断
OverlappingFileLockException - 如果此 Java 虚拟机已经持有与所请求区域重叠的锁定,或者如果另一个线程已阻塞在此方法中并且正在试图锁定同一文件的重叠区域
NonReadableChannelException - 如果 sharedtrue,但此通道不允许进行读取操作
NonWritableChannelException - 如果 sharedfalse,但此通道不允许进行写入操作
IOException - 如果发生其他 I/O 错误
另请参见:
lock(long,long,boolean), tryLock(), tryLock(long,long,boolean)

tryLock

public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                          throws IOException
试图获取对此通道的文件给定区域的锁定。

此方法不会阻塞。无论是否已成功地获得请求区域上的锁定,此方法的调用总是立即返回。如果由于另一个程序保持着一个重叠锁定而无法获取锁定,则此方法返回 null。如果由于任何其他原因而无法获取锁定,则抛出相应的异常。

positionsize 参数所指定的区域无需包含在实际的基础文件中,甚至无需与文件重叠。锁定区域的大小是固定的;如果某个已锁定区域最初包含整个文件,但文件因扩大而超出了该区域,则该锁定不覆盖此文件的新部分。如果期望文件大小扩大并且要求锁定整个文件,则应该锁定从零开始,到不小于期望最大文件大小为止的区域。零参数的 tryLock() 方法只是锁定大小为 Long.MAX_VALUE 的区域。

某些操作系统不支持共享锁定,在这种情况下,自动将对共享锁定的请求转换为对独占锁定的请求。可通过调用所得锁定对象的 isShared 方法来测试新获取的锁定是共享的还是独占的。

文件锁定以整个 Java 虚拟机来保持。但它们不适用于控制同一虚拟机内多个线程对文件的访问。

参数:
position - 锁定区域开始的位置;必须为非负数
size - 锁定区域的大小;必须为非负数,并且 position + size 的和必须为非负数
shared - 要请求共享锁定,则为 true,要请求独占锁定,则为 false
返回:
一个锁定对象,表示新获取的锁定,如果由于另一个程序保持着一个重叠锁定而无法获取锁定,则返回 null
抛出:
IllegalArgumentException - 如果关于参数的前提不成立
ClosedChannelException - 如果此通道已关闭
OverlappingFileLockException - 如果此 Java 虚拟机已经持有与所请求区域重叠的锁定,或者如果另一个线程已阻塞在此方法中并且正在试图锁定同一文件的重叠区域
IOException - 如果发生其他 I/O 错误
另请参见:
lock(), lock(long,long,boolean), tryLock()

tryLock

public final FileLock tryLock()
                       throws IOException
试图获取对此通道的文件的独占锁定。

调用此方法的形式为 fc.tryLock(), 该调用与以下调用完全相同:

     fc.tryLock(0L, Long.MAX_VALUE, false) 

返回:
一个锁定对象,表示新获取的锁定,如果由于另一个程序保持着一个重叠锁定而无法获取锁定,则返回 null
抛出:
ClosedChannelException - 如果此通道已关闭
OverlappingFileLockException - 如果此 Java 虚拟机已经持有与所请求区域重叠的锁定,或者如果另一个线程已阻塞于此方法中并且正在试图锁定一个重叠区域
IOException - 如果发生其他 I/O 错误
另请参见:
lock(), lock(long,long,boolean), tryLock(long,long,boolean)

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策