所有类


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大小。写入的字节超出文件的当前大小时,则增加文件的大小;截取 该文件时,则减小文件的大小。文件可能还有某个相关联的元数据,如访问权限、内容类型和最后的修改时间;此类未定义访问元数据的方法。

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

  • 以不影响通道当前位置的方式,对文件中绝对位置的字节进行读取写入

  • 将文件中的某个区域直接映射到内存中;对于较大的文件,这通常比调用普通的 readwrite 方法更为高效。

  • 强制对基础存储设备进行文件的更新,确保在系统崩溃时不丢失数据。

  • 以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中,反之亦然

  • 可以锁定某个文件区域,以阻止其他程序对其进行访问。

多个并发线程可安全地使用文件通道。可随时调用关闭方法,正如 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 classFileChannel.MapMode
          文件映射模式的类型安全的枚举。
 
构造方法摘要
protected FileChannel()
          初始化此类的一个新实例。
 
方法摘要
abstract  voidforce(boolean metaData)
          强制将所有对此通道的文件更新写入包含该文件的存储设备中。
 FileLocklock()
          获取对此通道的文件的独占锁定。
abstract  FileLocklock(long position, long size, boolean shared)
          获取此通道的文件给定区域上的锁定。
abstract  MappedByteBuffermap(FileChannel.MapMode mode, long position, long size)
          将此通道的文件区域直接映射到内存中。
abstract  longposition()
          返回此通道的文件位置。
abstract  FileChannelposition(long newPosition)
          设置此通道的文件位置。
abstract  intread(ByteBuffer dst)
          将字节序列从此通道读入给定的缓冲区。
 longread(ByteBuffer[] dsts)
          将字节序列从此通道读入给定的缓冲区。
abstract  longread(ByteBuffer[] dsts, int offset, int length)
          将字节序列从此通道读入给定缓冲区的子序列中。
abstract  intread(ByteBuffer dst, long position)
          从给定的文件位置开始,从此通道读取字节序列,并写入给定的缓冲区。
abstract  longsize()
          返回此通道的文件的当前大小。
abstract  longtransferFrom(ReadableByteChannel src, long position, long count)
          将字节从给定的可读取字节通道传输到此通道的文件中。
abstract  longtransferTo(long position, long count, WritableByteChannel target)
          将字节从此通道的文件传输到给定的可写入字节通道。
abstract  FileChanneltruncate(long size)
          将此通道的文件截取为给定大小。
 FileLocktryLock()
          试图获取对此通道的文件的独占锁定。
abstract  FileLocktryLock(long position, long size, boolean shared)
          试图获取对此通道的文件给定区域的锁定。
abstract  intwrite(ByteBuffer src)
          将字节序列从给定的缓冲区写入此通道。
 longwrite(ByteBuffer[] srcs)
          将字节序列从给定的缓冲区写入此通道。
abstract  longwrite(ByteBuffer[] srcs, int offset, int length)
          将字节序列从给定缓冲区的子序列写入此通道。
abstract  intwrite(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 错误