模块 java.base

类 FileChannel

所有已实现的接口:
Closeable , AutoCloseable , ByteChannel , Channel , GatheringByteChannel , InterruptibleChannel , ReadableByteChannel , ScatteringByteChannel , SeekableByteChannel , WritableByteChannel

public abstract class FileChannel extends AbstractInterruptibleChannel implements SeekableByteChannel , GatheringByteChannel , ScatteringByteChannel
用于读取、写入、映射和操作文件的通道。

文件通道是一个连接到文件的SeekableByteChannel 。它有电流position在其文件中可以是 queried modified 。该文件本身包含一个可变长度的字节序列,可以读取和写入并且可以查询其当前size 。当写入的字节超出其当前大小时,文件的大小会增加;文件大小在 truncated 时减小。该文件还可能有一些关联metadata例如访问权限、内容类型和最后修改时间;此类未定义元数据访问方法。

除了熟悉的字节通道的读、写和关闭操作外,该类还定义了以下文件特定的操作:

  • 字节可以是 read written 以不影响通道当前位置的方式位于文件中的绝对位置。

  • 文件的一个区域可能mapped 直接进入内存;对于大文件,这通常比调用通常的 readwrite 方法更有效。

  • 对文件所做的更新可能forced out 到底层存储设备,确保在系统崩溃时数据不会丢失。

  • 字节可以从文件 to some other channel vice versa 以一种可以被许多操作系统优化为非常快速的直接传输到文件系统缓存或从文件系统缓存传输的方式进行传输。

  • 文件的某个区域可能locked 禁止其他程序访问。

文件通道可以安全地供多个并发线程使用。 close 方法可以随时调用,由 Channel 接口指定。在任何给定时间只能进行一项涉及通道位置或可以更改其文件大小的操作;在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成。其他操作,特别是那些采取明确立场的操作,可以同时进行;他们实际上是否这样做取决于底层实现,因此未指定。

此类实例提供的文件视图保证与同一程序中其他实例提供的同一文件的其他视图一致。然而,由于底层操作系统执行的缓存和网络文件系统协议引起的延迟,此类实例提供的视图可能与其他同时运行的程序看到的视图一致也可能不一致。不管这些其他程序是用什么语言编写的,也不管它们是在同一台机器上还是在其他机器上运行,都是如此。任何此类不一致的确切性质取决于系统,因此未指定。

通过调用此类定义的 open 方法之一创建文件通道。还可以通过调用对象的 getChannel 方法从现有的 FileInputStream FileOutputStream RandomAccessFile 对象获取文件通道,该方法返回连接到同一基础文件的文件通道。如果文件通道是从现有流或随机访问文件中获取的,则文件通道的状态与其 getChannel 方法返回通道的对象的状态密切相关。更改通道的位置,无论是显式更改还是通过读取或写入字节,都会更改原始对象的文件位置,反之亦然。通过文件通道更改文件的长度将更改通过原始对象看到的长度,反之亦然。通过写入字节更改文件内容将更改原始对象看到的内容,反之亦然。

此类在不同点指定需要“对读开放”、“对写开放”或“对读写开放”的实例。通过 FileInputStream 实例的 getChannel 方法获得的通道将打开以供读取。通过 FileOutputStream 实例的 getChannel 方法获得的通道将打开以供写入。最后,如果实例是使用"r"模式创建的,则通过RandomAccessFile 实例的getChannel 方法获得的通道将开放供读取,如果实例是使用模式"rw"创建的,则将开放供读取和写入。

为写入而打开的文件通道可能位于附加模式,例如,如果它是从通过调用 FileOutputStream(File,boolean) 构造函数并为第二个参数传递 true 创建的文件输出流中获得的。在这种模式下,每次调用相关写操作首先将位置推进到文件末尾,然后写入请求的数据。位置的推进和数据的写入是否在单个原子操作中完成是系统相关的,因此未指定。在此模式下,写在给定的位置 方法的行为也取决于系统。

自从:
1.4
参见:
  • 内部类总结

    内部类
    修饰符和类型
    描述
    static class 
    文件映射模式。
  • 构造方法总结

    构造方法
    修饰符
    构造方法
    描述
    protected
    初始化此类的新实例。
  • 方法总结

    修饰符和类型
    方法
    描述
    abstract void
    force(boolean metaData)
    强制将对此通道文件的任何更新写入包含它的存储设备。
    final FileLock
    lock()
    获取此通道文件的独占锁。
    abstract FileLock
    lock(long position, long size, boolean shared)
    获取此通道文件的给定区域的锁。
    map(FileChannel.MapMode mode, long position, long size)
    将此通道文件的一个区域直接映射到内存中。
    map(FileChannel.MapMode mode, long offset, long size, SegmentScopePREVIEW session)
    预览。
    将此通道文件的一个区域映射到一个新的映射内存段,具有给定的偏移量、大小和内存会话。
    static FileChannel
    open(Path path, OpenOption... options)
    打开或创建一个文件,返回一个文件通道来访问该文件。
    static FileChannel
    open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs)
    打开或创建一个文件,返回一个文件通道来访问该文件。
    abstract long
    返回此通道的文件位置。
    abstract FileChannel
    position(long newPosition)
    设置此通道的文件位置。
    abstract int
    从此通道读取一系列字节到给定的缓冲区中。
    final 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)
    将此通道的文件截断为给定大小。
    final FileLock
    尝试获取此通道文件的独占锁。
    abstract FileLock
    tryLock(long position, long size, boolean shared)
    尝试获取此通道文件的给定区域的锁。
    abstract int
    将给定缓冲区中的字节序列写入此通道。
    final 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 中声明的方法

    isOpen
  • 构造方法详细信息

    • FileChannel

      protected FileChannel()
      初始化此类的新实例。
  • 方法详情

    • open

      public static FileChannel  open(Path  path, Set <? extends OpenOption > options, FileAttribute <?>... attrs) throws IOException
      打开或创建一个文件,返回一个文件通道来访问该文件。

      options 参数确定文件的打开方式。 READ WRITE 选项确定是否应打开文件进行读取和/或写入。如果数组中不包含任何选项(或 APPEND 选项),则打开文件进行读取。默认情况下,读取或写入从文件的开头开始。

      除了 READWRITE 之外,还可能存在以下选项:

      其他选项
      Option Description
      APPEND 如果存在此选项,则打开文件进行写入,每次调用通道的 write 方法首先将位置推进到文件末尾,然后写入请求的数据。位置的推进和数据的写入是否在单个原子操作中完成是系统相关的,因此未指定。带有此选项的 在指定位置书写 的效果未指定。此选项不能与 READTRUNCATE_EXISTING 选项一起使用。
      TRUNCATE_EXISTING 如果存在此选项,则现有文件将被截断为 0 字节的大小。当文件只为阅读而打开时,该选项将被忽略。
      CREATE_NEW 如果存在此选项,则会创建一个新文件,如果该文件已经存在,则会失败。创建文件时,检查文件是否存在以及文件不存在时的创建对于其他文件系统操作是原子的。当文件只为阅读而打开时,该选项将被忽略。
      CREATE 如果存在此选项,则打开现有文件(如果存在),否则创建新文件。创建文件时,检查文件是否存在以及文件不存在时的创建对于其他文件系统操作是原子的。如果 CREATE_NEW 选项也存在或文件打开仅供阅读,则忽略此选项。
      DELETE_ON_CLOSE 如果存在此选项,则实现会在通过 close 方法关闭时尝试 best effort 删除文件。如果未调用 close 方法,则在 Java 虚拟机终止时会尝试 best effort 删除该文件。
      SPARSE 创建新文件时,此选项是 hint 新文件将是稀疏的。不创建新文件时忽略此选项。
      SYNC 要求对文件内容或元数据的每次更新都同步写入底层存储设备。 (参见 同步 I/O 文件完整性 )。
      DSYNC 要求对文件内容的每次更新都同步写入底层存储设备。 (参见 同步 I/O 文件完整性 )。

      一个实现也可能支持额外的选项。

      attrs 参数是文件 file-attributes 的可选数组,在创建文件时自动设置。

      通过在创建 Path 的提供者上调用 newFileChannel 方法来创建新通道。

      参数:
      path - 要打开或创建的文件的路径
      options - 指定文件打开方式的选项
      attrs - 创建文件时自动设置的可选文件属性列表
      返回:
      一个新的文件通道
      抛出:
      IllegalArgumentException - 如果集合包含无效的选项组合
      UnsupportedOperationException - 如果 path 与不支持创建文件通道的提供程序相关联,或者指定了不支持的打开选项,或者数组包含在创建文件时无法自动设置的属性
      FileAlreadyExistsException - 如果该名称的文件已经存在并且指定了 CREATE_NEW 选项并且正在打开文件进行写入(可选的特定异常 )
      IOException - 如果发生 I/O 错误
      SecurityException - 如果安装了安全管理器并且它拒绝实施所需的未指定权限。对于默认提供程序,如果打开文件进行读取,将调用 SecurityManager.checkRead(String) 方法来检查读取访问权限。 SecurityManager.checkWrite(String) 方法被调用来检查写访问,如果文件打开写
      自从:
      1.7
    • open

      public static FileChannel  open(Path  path, OpenOption ... options) throws IOException
      打开或创建一个文件,返回一个文件通道来访问该文件。

      此方法的调用与调用的行为完全相同

         fc.open (file, opts, new FileAttribute<?>[0]);
       
      其中 opts options 数组中指定的一组选项。
      参数:
      path - 要打开或创建的文件的路径
      options - 指定文件打开方式的选项
      返回:
      一个新的文件通道
      抛出:
      IllegalArgumentException - 如果集合包含无效的选项组合
      UnsupportedOperationException - 如果 path 与不支持创建文件通道的提供程序关联,或者指定了不支持的打开选项
      FileAlreadyExistsException - 如果该名称的文件已经存在并且指定了 CREATE_NEW 选项并且正在打开文件进行写入(可选的特定异常 )
      IOException - 如果发生 I/O 错误
      SecurityException - 如果安装了安全管理器并且它拒绝实施所需的未指定权限。对于默认提供程序,如果打开文件进行读取,将调用 SecurityManager.checkRead(String) 方法来检查读取访问权限。 SecurityManager.checkWrite(String) 方法被调用来检查写访问,如果文件打开写
      自从:
      1.7
    • read

      public abstract int read(ByteBuffer  dst) throws IOException
      从此通道读取一系列字节到给定的缓冲区中。

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

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

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

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

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

      public final long read(ByteBuffer [] dsts) throws IOException
      从此通道读取一系列字节到给定的缓冲区中。

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

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

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

      字节从该通道的当前文件位置开始写入,除非该通道处于追加模式,在这种情况下,该位置首先前进到文件末尾。如有必要,文件会增长以容纳写入的字节,然后文件位置会根据实际写入的字节数进行更新。否则,此方法的行为与 WritableByteChannel 接口所指定的完全相同。

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

      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 - 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
      NonWritableChannelException - 如果此通道未打开进行写入
      IOException - 如果发生其他 I/O 错误
    • write

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

      字节从该通道的当前文件位置开始写入,除非该通道处于追加模式,在这种情况下,该位置首先前进到文件末尾。如有必要,文件会增长以容纳写入的字节,然后文件位置会根据实际写入的字节数进行更新。否则此方法的行为与 GatheringByteChannel 接口中指定的完全相同。

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

      public abstract long position() throws IOException
      返回此通道的文件位置。
      指定者:
      position 在接口 SeekableByteChannel
      返回:
      本通道的文件位置,一个非负整数,计算从文件开头到当前位置的字节数
      抛出:
      ClosedChannelException - 如果此通道关闭
      IOException - 如果发生其他 I/O 错误
    • position

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

      将位置设置为大于文件当前大小的值是合法的,但不会更改文件的大小。稍后尝试读取此类位置的字节将立即返回文件结束指示。稍后尝试在这样的位置写入字节将导致文件增长以容纳新字节;前一个文件结尾和新写入的字节之间的任何字节的值都是未指定的。

      指定者:
      position 在接口 SeekableByteChannel
      参数:
      newPosition - 新位置,一个非负整数,从文件开头计算字节数
      返回:
      这个文件通道
      抛出:
      ClosedChannelException - 如果此通道关闭
      IllegalArgumentException - 如果新位置为负
      IOException - 如果发生其他 I/O 错误
    • size

      public abstract long size() throws IOException
      返回此通道文件的当前大小。
      指定者:
      size 在接口 SeekableByteChannel
      返回:
      该通道文件的当前大小,以字节为单位
      抛出:
      ClosedChannelException - 如果此通道关闭
      IOException - 如果发生其他 I/O 错误
    • truncate

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

      如果给定的大小小于文件的当前大小,则文件将被截断,丢弃超出文件新末尾的所有字节。如果给定的大小大于或等于文件的当前大小,则文件不会被修改。在任何一种情况下,如果此通道的文件位置大于给定大小,则将其设置为该大小。

      指定者:
      truncate 在接口 SeekableByteChannel
      参数:
      size - 新大小,非负字节数
      返回:
      这个文件通道
      抛出:
      NonWritableChannelException - 如果此通道未打开进行写入
      ClosedChannelException - 如果此通道关闭
      IllegalArgumentException - 如果新尺寸为负
      IOException - 如果发生其他 I/O 错误
    • force

      public abstract void force(boolean metaData) throws IOException
      强制将对此通道文件的任何更新写入包含它的存储设备。

      如果此通道的文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建此通道或自上次调用此方法以来对该文件所做的所有更改都已写入该设备。这对于确保在系统崩溃时不会丢失关键信息很有用。

      如果文件不驻留在本地设备上,则不提供此类保证。

      metaData 参数可用于限制此方法需要执行的 I/O 操作数。为该参数传递 false 表示只有对文件内容的更新需要写入存储;传递 true 表示必须写入文件内容和元数据的更新,这通常需要至少一个以上的 I/O 操作。此参数是否实际有任何影响取决于底层操作系统,因此未指定。

      调用此方法可能会导致发生 I/O 操作,即使通道仅为读取而打开也是如此。例如,某些操作系统将上次访问时间作为文件元数据的一部分进行维护,并且每当读取文件时都会更新此时间。这是否实际完成取决于系统,因此未指定。

      此方法仅保证强制更改通过此类中定义的方法或在使用 getChannel 方法获取通道时由 FileOutputStream RandomAccessFile 定义的方法对该通道的文件所做的更改。它可能会也可能不会强制更改通过修改通过调用 map 方法获得的 mapped byte buffer 的内容所做的更改。调用映射字节缓冲区的 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 - 如果位置为负数或缓冲区为只读
      NonReadableChannelException - 如果这个通道没有打开阅读
      ClosedChannelException - 如果此通道关闭
      AsynchronousCloseException - 如果另一个线程在读取操作正在进行时关闭此通道
      ClosedByInterruptException - 如果另一个线程在读取操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
      IOException - 如果发生其他 I/O 错误
    • write

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

      此方法的工作方式与 write(ByteBuffer) 方法相同,不同之处在于字节是从给定文件位置而不是通道的当前位置开始写入的。该方法不修改该通道的位置。如果给定位置大于文件的当前大小,则文件将增长以容纳新字节;前一个文件结尾和新写入的字节之间的任何字节的值都是未指定的。

      如果文件在 附加模式 中打开,则调用此方法的效果未指定。

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

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

      mode 参数指定文件区域的映射方式,可以是以下模式之一:

      • 只读:任何修改生成的缓冲区的尝试都将导致抛出 ReadOnlyBufferException 。 (MapMode.READ_ONLY )

      • 读/写:对结果缓冲区所做的更改最终将传播到文件;它们可能对映射同一文件的其他程序可见,也可能不可见。 (MapMode.READ_WRITE )

      • 私人的:对结果缓冲区所做的更改不会传播到文件,并且对映射同一文件的其他程序不可见;相反,它们将创建缓冲区修改部分的私有副本。 (MapMode.PRIVATE )

      一个实现可能支持额外的map模式。

      对于只读映射,此通道必须已打开以供读取;对于读/写或私有映射,此通道必须已打开用于读取和写入。

      此方法返回的 mapped byte buffer 的位置为零,限制和容量为 size ;它的标记将是不确定的。缓冲区及其表示的映射将保持有效,直到缓冲区本身被垃圾回收。

      映射一旦建立,就不依赖于用于创建它的文件通道。特别是关闭通道对映射的有效性没有影响。

      内存映射文件的许多细节本质上取决于底层操作系统,因此未指定。当请求的区域未完全包含在此通道的文件中时,此方法的行为未指定。此程序或其他程序对基础文件的内容或大小所做的更改是否传播到缓冲区是未指定的。未指定对缓冲区的更改传播到文件的速率。

      对于大多数操作系统,将文件映射到内存比通过通常的read write 方法读取或写入几十 KB 的数据更昂贵。从性能的角度来看,通常只值得将相对较大的文件映射到内存中。

      参数:
      mode - FileChannel.MapMode 类中定义的常量 READ_ONLY READ_WRITE PRIVATE 之一,分别根据文件是只读映射、读/写映射还是私有映射(写时复制)或实现具体map模式
      position - 文件中映射区域开始的位置;必须是非负的
      size - 要映射的区域的大小;必须为非负且不大于 Integer.MAX_VALUE
      返回:
      映射字节缓冲区
      抛出:
      NonReadableChannelException - 如果 modeREAD_ONLY 或需要读取访问的实现特定map模式,但此通道未打开以供读取
      NonWritableChannelException - 如果 modeREAD_WRITE PRIVATE 或需要写入访问的特定于实现的映射模式,但此通道未打开以进行读写
      IllegalArgumentException - 如果参数的先决条件不成立
      UnsupportedOperationException - 如果指定了不支持的map模式
      IOException - 如果发生其他 I/O 错误
      参见:
    • map

      public MemorySegment PREVIEW  map(FileChannel.MapMode  mode, long offset, long size, SegmentScope PREVIEW  session) throws IOException
      map 是 Java 平台的预览 API。
      程序只能在启用预览功能时使用 map
      预览功能可能会在未来的版本中删除,或升级为 Java 平台的永久功能。
      将此通道文件的一个区域映射到一个新的映射内存段,具有给定的偏移量、大小和内存会话。 addressPREVIEW 返回的内存段的起始地址是支持该段的映射堆外区域的起始地址。

      如果指定的map模式为 READ_ONLY ,则生成的段将是只读的(请参阅 MemorySegment.isReadOnly() PREVIEW ).

      映射内存段的内容可以随时更改,例如,如果map文件的相应区域的内容被这个(或另一个)程序更改。此类更改是否发生以及何时发生取决于操作系统,因此未指定。

      映射内存段的全部或部分可能随时变得不可访问,例如,如果备份映射文件被截断。尝试访问映射内存段的不可访问区域不会更改该段的内容,并且会导致在访问时或稍后的某个时间抛出未指定的异常。因此,强烈建议采取适当的预防措施,以避免此(或其他)程序对映射文件进行操作,读取或写入文件内容除外。

      实现要求:
      此方法的默认实现抛出 UnsupportedOperationException
      实现注意事项:
      从新创建的文件通道获取映射段时,与返回的映射内存段关联的映射内存块内容的初始化状态未指定,不应依赖。
      参数:
      mode - 文件映射模式,见map(FileChannel.MapMode, long, long) ;映射模式可能会影响返回的内存映射段的行为(参见MemorySegment.force() PREVIEW ).
      offset - 文件中映射段开始的偏移量(以字节表示)。
      size - 支持内存段的映射内存的大小(以字节为单位)。
      session - 段内存会话。
      返回:
      一个新的映射内存段。
      抛出:
      IllegalArgumentException - 如果 offset < 0size < 0offset + size 溢出 long 的范围。
      IllegalStateException - 如果 session 不是 PREVIEW .
      WrongThreadException - 如果从线程 拥有 以外的线程调用此方法PREVIEW session
      NonReadableChannelException - 如果 modeREAD_ONLY 或需要读取访问权限的实现特定map模式,但此通道未打开以供读取。
      NonWritableChannelException - 如果 modeREAD_WRITE PRIVATE 或需要写入访问的特定于实现的映射模式,但此通道未打开以进行读取和写入。
      IOException - 如果发生其他 I/O 错误。
      UnsupportedOperationException - 如果指定了不支持的map模式。
      自从:
      19
    • lock

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

      对该方法的调用将阻塞,直到可以锁定该区域、关闭该通道或中断调用线程,以先发生者为准。

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

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

      positionsize 参数指定的区域不需要包含在实际的底层文件中,甚至不需要重叠。锁定区域的大小是固定的;如果锁定的区域最初包含文件的末尾并且文件超出该区域,则文件的新部分将不会被锁定覆盖。如果预期文件的大小会增加并且需要锁定整个文件,则应锁定从零开始且不小于文件的预期最大大小的区域。零参数 lock() 方法只是锁定大小为 Long.MAX_VALUE 的区域。如果 position 为非负且 size 为零,则返回大小为 Long.MAX_VALUE - position 的锁。

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

      文件锁代表整个 Java 虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。

      参数:
      position - 锁定区域开始的位置;必须是非负的
      size - 锁定区域的大小;必须是非负的,和 position + size 必须是非负的。值为零表示锁定从指定起始位置到文件末尾的所有字节,无论文件随后是否被扩展或截断
      shared - true 请求共享锁,在这种情况下,此通道必须打开以供读取(可能还有写入); false 请求独占锁,在这种情况下,此通道必须打开以进行写入(可能还有读取)
      返回:
      代表新获得的锁的锁对象
      抛出:
      IllegalArgumentException - 如果参数的先决条件不成立
      ClosedChannelException - 如果此通道关闭
      AsynchronousCloseException - 如果调用线程在此方法中被阻塞时另一个线程关闭此通道
      FileLockInterruptionException - 如果调用线程在此方法中被阻塞时被中断
      OverlappingFileLockException - 如果与请求区域重叠的锁已被此 Java 虚拟机持有,或者如果另一个线程已在此方法中阻塞并试图锁定重叠区域
      NonReadableChannelException - 如果 sharedtrue 但此通道未打开供读取
      NonWritableChannelException - 如果 sharedfalse 但此通道未打开写入
      IOException - 如果发生其他 I/O 错误
      参见:
    • lock

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

      fc.lock() 形式的方法的调用与调用的行为完全相同

         fc.lock (0L, Long.MAX_VALUE, false) 
      返回:
      代表新获得的锁的锁对象
      抛出:
      ClosedChannelException - 如果此通道关闭
      AsynchronousCloseException - 如果调用线程在此方法中被阻塞时另一个线程关闭此通道
      FileLockInterruptionException - 如果调用线程在此方法中被阻塞时被中断
      OverlappingFileLockException - 如果与请求区域重叠的锁已被此 Java 虚拟机持有,或者如果另一个线程已在此方法中阻塞并试图锁定同一文件的重叠区域
      NonWritableChannelException - 如果此通道未打开进行写入
      IOException - 如果发生其他 I/O 错误
      参见:
    • tryLock

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

      此方法不会阻塞。调用总是立即返回,要么在请求的区域上获得了锁,要么没有这样做。如果由于另一个程序持有重叠锁而未能获得锁,则它返回 null 。如果由于任何其他原因未能获得锁,则抛出适当的异常。

      positionsize 参数指定的区域不需要包含在实际的底层文件中,甚至不需要重叠。锁定区域的大小是固定的;如果锁定的区域最初包含文件的末尾并且文件超出该区域,则文件的新部分将不会被锁定覆盖。如果预期文件的大小会增加并且需要锁定整个文件,则应锁定从零开始且不小于文件的预期最大大小的区域。零参数 tryLock() 方法只是锁定大小为 Long.MAX_VALUE 的区域。如果 position 为非负且 size 为零,则返回大小为 Long.MAX_VALUE - position 的锁。

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

      文件锁代表整个 Java 虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。

      参数:
      position - 锁定区域开始的位置;必须是非负的
      size - 锁定区域的大小;必须是非负的,和 position + size 必须是非负的。值为零表示锁定从指定起始位置到文件末尾的所有字节,无论文件随后是否被扩展或截断
      shared - true 请求共享锁,false 请求排他锁
      返回:
      表示新获取的锁的锁对象,如果由于另一个程序持有重叠锁而无法获取锁,则为 null
      抛出:
      IllegalArgumentException - 如果参数的先决条件不成立
      ClosedChannelException - 如果此通道关闭
      OverlappingFileLockException - 如果与请求区域重叠的锁已被此 Java 虚拟机持有,或者如果另一个线程已在此方法中阻塞并试图锁定同一文件的重叠区域
      NonReadableChannelException - 如果 sharedtrue 但此通道未打开供读取
      NonWritableChannelException - 如果 sharedfalse 但此通道未打开写入
      IOException - 如果发生其他 I/O 错误
      参见:
    • tryLock

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

      fc.tryLock() 形式的方法的调用与调用的行为完全相同

         fc.tryLock (0L, Long.MAX_VALUE, false) 
      返回:
      表示新获取的锁的锁对象,如果由于另一个程序持有重叠锁而无法获取锁,则为 null
      抛出:
      ClosedChannelException - 如果此通道关闭
      OverlappingFileLockException - 如果与请求区域重叠的锁已被此 Java 虚拟机持有,或者如果另一个线程已在此方法中阻塞并试图锁定重叠区域
      NonWritableChannelException - 如果此通道未打开进行写入
      IOException - 如果发生其他 I/O 错误
      参见: