Module java.base

Class FileChannel

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

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

文件通道是一个连接到文件的SeekableByteChannel。它在文件中有一个当前的位置,可以同时进行查询修改。文件本身包含一个可变长度的字节序列,可以读取和写入,并且可以查询其当前的大小。当写入超出当前大小时,文件的大小会增加;当截断文件时,文件的大小会减小。文件还可能具有一些关联的元数据,如访问权限、内容类型和最后修改时间;此类不定义用于访问元数据的方法。

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

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

  • 文件的一部分可以直接映射到内存中;对于大文件,这通常比调用通常的readwrite方法更有效。

  • 对文件进行的更新可以通过强制写入到底层存储设备,确保在系统崩溃时不会丢失数据。

  • 字节可以从文件传输到其他通道,反之亦然,这样可以由许多操作系统优化为直接快速传输到或从文件系统缓存中。

  • 文件的一部分可以锁定,防止其他程序访问。

文件通道可安全地供多个并发线程使用。可以在任何时候调用close方法,如Channel接口所规定的。在任何给定时间只能有一个涉及通道位置或可能改变文件大小的操作正在进行;在第一个操作仍在进行时尝试启动第二个这样的操作将被阻塞,直到第一个操作完成。其他操作,特别是那些需要显式位置的操作,可以同时进行;它们是否实际上这样做取决于底层实现,因此是未指定的。

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

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

在此类的各个点上指定了“用于读取打开”,“用于写入打开”或“用于读取和写入打开”的实例是必需的。通过FileInputStream.getChannel()方法获取的FileInputStream实例的通道将用于读取。通过FileOutputStream.getChannel()方法获取的FileOutputStream实例的通道将用于写入。最后,通过RandomAccessFile.getChannel()方法获取的RandomAccessFile实例的通道将在实例使用模式"r"创建时用于读取,并在实例使用模式"rw"创建时用于读取和写入。

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

自从:
1.4
参见:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    文件映射模式。
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    初始化此类的新实例。
  • Method Summary

    Modifier and Type
    Method
    Description
    abstract void
    force(boolean metaData)
    强制将此通道的文件的任何更新写入包含它的存储设备。
    final FileLock
    lock()
    在此通道的文件上获取独占锁。
    abstract FileLock
    lock(long position, long size, boolean shared)
    在此通道的文件的给定区域上获取锁。
    abstract MappedByteBuffer
    map(FileChannel.MapMode mode, long position, long size)
    将此通道的文件的区域直接映射到内存中。
    map(FileChannel.MapMode mode, long offset, long size, ArenaPREVIEW arena)
    预览。
    将此通道的文件的区域映射到新的映射内存段中,具有给定的偏移量、大小和区域。
    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)
    从给定文件位置开始,从给定缓冲区向此通道写入一系列字节。

    Methods declared in class java.nio.channels.spi.AbstractInterruptibleChannel

    begin, close, end, implCloseChannel, isOpen

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods declared in interface java.nio.channels.Channel

    isOpen
  • Constructor Details

    • FileChannel

      protected FileChannel()
      初始化此类的新实例。
  • Method Details

    • open

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

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

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

      附加选项
      选项 描述
      APPEND 如果存在此选项,则文件将以写入方式打开,并且每次调用通道的 write 方法时,首先将位置推进到文件末尾,然后写入请求的数据。 位置的推进和数据的写入是否在单个原子操作中完成取决于系统,因此未指定。 在存在此选项的情况下,使用 READTRUNCATE_EXISTING 选项是不允许的。
      TRUNCATE_EXISTING 如果存在此选项,则现有文件将被截断为0字节。 当文件仅以读取方式打开时,此选项将被忽略。
      CREATE_NEW 如果存在此选项,则将创建一个新文件,如果文件已经存在则操作将失败。 创建文件时,对文件的存在性检查和文件不存在时的创建是原子操作,与其他文件系统操作一致。 当文件仅以读取方式打开时,此选项将被忽略。
      CREATE 如果存在此选项,则如果存在文件则打开现有文件,否则将创建一个新文件。 创建文件时,对文件的存在性检查和文件不存在时的创建是原子操作,与其他文件系统操作一致。 如果同时存在 CREATE_NEW 选项或文件仅以读取方式打开,则将忽略此选项。
      DELETE_ON_CLOSE 如果存在此选项,则在通过 close 方法关闭时,实现将尽力删除文件。 如果未调用 close 方法,则在Java虚拟机终止时将尽力删除文件。
      SPARSE 在创建新文件时,此选项是新文件将是稀疏的一个提示。 当不创建新文件时,将忽略此选项。
      SYNC 要求将对文件内容或元数据的每次更新同步写入底层存储设备。 (请参阅 同步I/O文件完整性)。
      DSYNC 要求将文件内容的每次更新同步写入底层存储设备。 (请参阅 同步I/O文件完整性)。

      实现还可以支持其他选项。

      attrs参数是一个可选的文件 文件属性 数组,在创建文件时原子设置。

      通过在创建 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操作,即使通道仅用于读取。例如,一些操作系统会将最后访问时间作为文件元数据的一部分,并且每当读取文件时都会更新此时间。是否实际执行此操作取决于系统,因此是未指定的。

      此方法仅保证强制将通过此类中定义的方法对该通道文件所做的更改,或通过FileOutputStreamRandomAccessFile定义的方法在使用getChannel方法获取通道时所做的更改写入。它可能或可能不会强制将通过调用映射的字节缓冲区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 - 如果位置为负数或缓冲区为只读
      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)

      实现可能支持其他映射模式。

      对于只读映射,此通道必须已经以读取模式打开;对于读/写或私有映射,此通道必须已经以读写模式打开。

      此方法返回的映射的字节缓冲区将具有零位置和size的限制和容量;其标记将是未定义的。缓冲区及其所代表的映射将保持有效,直到缓冲区本身被垃圾回收。

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

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

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

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

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

      返回段的生命周期由提供的区域控制。例如,如果提供的区域是可关闭区域,则在提供的可关闭区域关闭PREVIEW时,返回的段将被取消映射。

      如果指定的映射模式是READ_ONLY,则结果段将是只读的(参见MemorySegment.isReadOnly()PREVIEW)。

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

      映射内存段的全部或部分可能在任何时候变得无法访问,例如,如果支持的映射文件被截断。尝试访问映射内存段的无法访问区域不会更改段的内容,并将导致在访问时或稍后的某个时间抛出未指定的异常。因此,强烈建议采取适当的预防措施,以避免通过此(或其他)程序操纵映射文件,除非读取或写入文件的内容。

      实现要求:
      此方法的默认实现会抛出UnsupportedOperationException
      实现说明:
      从新创建的文件通道获取映射段时,与返回的映射内存段相关联的内存块的内容初始化状态是未指定的,不应依赖于它。
      参数:
      mode - 文件映射模式,请参见map(FileChannel.MapMode, long, long);映射模式可能会影响返回的内存映射段的行为(参见MemorySegment.force()PREVIEW)。
      offset - 映射段在文件中开始的偏移量(以字节表示)。
      size - 支持内存段的映射内存的大小(以字节为单位)。
      arena - 段区域。
      返回:
      新的映射内存段。
      抛出:
      IllegalArgumentException - 如果offset < 0size < 0offset + size溢出long范围。
      IllegalStateException - 如果arena.isAlive() == false
      WrongThreadException - 如果arena是受限作用域的区域,并且此方法是从线程T调用的,而不是受限作用域的所有者线程。
      NonReadableChannelException - 如果modeREAD_ONLY或需要读取访问权限的实现特定映射模式,但此通道未以读取模式打开。
      NonWritableChannelException - 如果modeREAD_WRITEPRIVATE或需要写入访问权限的实现特定映射模式,但此通道未同时以读取和写入模式打开。
      IOException - 如果发生其他I/O错误。
      UnsupportedOperationException - 如果指定了不受支持的映射模式。
      自:
      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错误
      参见: