模块 java.base
 java.nio

类 MappedByteBuffer

所有已实现的接口:
Comparable<ByteBuffer>

public abstract sealed class MappedByteBuffer extends ByteBuffer
一个直接字节缓冲区,其内容是文件的内存映射区域。

映射字节缓冲区是通过FileChannel.map 方法创建的。此类使用特定于内存映射文件区域的操作扩展 ByteBuffer 类。

映射的字节缓冲区及其表示的文件映射在缓冲区本身被垃圾回收之前一直有效。

映射字节缓冲区的内容可以随时更改,例如,如果map文件的相应区域的内容被该程序或其他程序更改。此类更改是否发生以及何时发生取决于操作系统,因此未指定。

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

映射字节缓冲区在其他方面的行为与普通的直接字节缓冲区没有区别。

自从:
1.4
  • 方法详情

    • isLoaded

      public final boolean isLoaded()
      告知此缓冲区的内容是否驻留在物理内存中。

      true 的返回值意味着很可能此缓冲区中的所有数据都驻留在物理内存中,因此可以在不引起任何虚拟内存页面错误或 I/O 操作的情况下进行访问。 false 的返回值并不一定意味着缓冲区的内容不驻留在物理内存中。

      返回值是一个提示,而不是保证,因为在调用此方法返回时,底层操作系统可能已经调出缓冲区的一些数据。

      返回:
      true 如果此缓冲区的内容可能驻留在物理内存中
    • load

      public final MappedByteBuffer  load()
      将此缓冲区的内容加载到物理内存中。

      此方法尽最大努力确保在返回时此缓冲区的内容驻留在物理内存中。调用此方法可能会导致发生一些页面错误和 I/O 操作。

      返回:
      这个缓冲区
    • force

      public final MappedByteBuffer  force()
      强制将对此缓冲区内容所做的任何更改写入包含映射文件的存储设备。该区域在此缓冲区中从索引零开始,大小为 capacity() 字节。此方法的调用与调用 force(0,capacity()) 的行为方式完全相同。

      如果map到此缓冲区的文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建缓冲区或自上次调用此方法以来对缓冲区所做的所有更改都已写入该设备。

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

      如果此缓冲区未映射到读/写模式 (FileChannel.MapMode.READ_WRITE ),则调用此方法可能无效。特别是,该方法对以只读或私有映射模式映射的缓冲区没有影响。此方法可能会或可能不会影响特定于实现的映射模式。

      返回:
      这个缓冲区
      抛出:
      UncheckedIOException - 如果发生 I/O 错误,将缓冲区的内容写入包含映射文件的存储设备
    • force

      public final MappedByteBuffer  force(int index, int length)
      强制将对此缓冲区内容的区域所做的任何更改写入包含映射文件的存储设备。该区域在此缓冲区中从给定的 index 开始,大小为 length 字节。

      如果map到此缓冲区的文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建或自上次调用此方法以来对所选区域缓冲区所做的所有更改都已写入该设备.强制操作可以自由写入位于指定区域之外的字节,例如,以确保某些设备特定粒度的数据块被完整传输。

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

      如果此缓冲区未映射到读/写模式 (FileChannel.MapMode.READ_WRITE ),则调用此方法可能无效。特别是,该方法对以只读或私有映射模式映射的缓冲区没有影响。此方法可能会或可能不会影响特定于实现的映射模式。

      参数:
      index - 缓冲区中要写回存储的第一个字节的索引;必须为非负且小于 capacity()
      length - 以字节为单位的区域长度;必须为非负且不大于 capacity() - index
      返回:
      这个缓冲区
      抛出:
      IndexOutOfBoundsException - 如果索引和长度的先决条件不成立。
      UncheckedIOException - 如果发生 I/O 错误,将缓冲区的内容写入包含映射文件的存储设备
      自从:
      13
    • position

      public final MappedByteBuffer  position(int newPosition)
      设置此缓冲区的位置。如果标记已定义且大于新位置,则将其丢弃。
      重写:
      position 在类 Buffer
      参数:
      newPosition - 新的位置值;必须为非负且不大于电流限制
      返回:
      这个缓冲区
    • limit

      public final MappedByteBuffer  limit(int newLimit)
      设置此缓冲区的限制。如果位置大于新限制,则将其设置为新限制。如果标记已定义且大于新限制,则将其丢弃。
      重写:
      limit 在类 Buffer
      参数:
      newLimit - 新的极限值;必须为非负且不大于此缓冲区的容量
      返回:
      这个缓冲区
    • mark

      public final MappedByteBuffer  mark()
      在其位置设置此缓冲区的标记。
      重写:
      mark 在类 Buffer
      返回:
      这个缓冲区
    • reset

      public final MappedByteBuffer  reset()
      将此缓冲区的位置重置为先前标记的位置。

      调用此方法既不会更改也不会丢弃标记的值。

      重写:
      reset 在类 Buffer
      返回:
      这个缓冲区
    • clear

      public final MappedByteBuffer  clear()
      清除此缓冲区。位置设置为零,限制设置为容量,标记被丢弃。

      在使用一系列通道读取或之前调用此方法put填充此缓冲区的操作。例如:

       buf.clear();   // Prepare buffer for reading
       in.read(buf);  // Read data

      这种方法实际上并没有擦除缓冲区中的数据,但它的命名就好像它确实擦除一样,因为它最常用于可能是这种情况的情况。

      重写:
      clear 在类 Buffer
      返回:
      这个缓冲区
    • flip

      public final MappedByteBuffer  flip()
      翻转此缓冲区。限制设置为当前位置,然后位置设置为零。如果标记已定义,则将其丢弃。

      经过一系列通道读取或put操作,调用此方法来准备一系列通道写入或相关get操作。例如:

       buf.put(magic);  // Prepend header
       in.read(buf);   // Read data into rest of buffer
       buf.flip();    // Flip buffer
       out.write(buf);  // Write header + data to channel

      在将数据从一个地方传输到另一个地方时,该方法通常与compact 方法结合使用。

      重写:
      flip 在类 Buffer
      返回:
      这个缓冲区
    • rewind

      public final MappedByteBuffer  rewind()
      倒带此缓冲区。位置设置为零,标记被丢弃。

      在一系列通道写入或之前调用此方法get操作,假设已经适当地设置了限制。例如:

       out.write(buf);  // Write remaining data
       buf.rewind();   // Rewind buffer
       buf.get(array);  // Copy data into array
      重写:
      rewind 在类 Buffer
      返回:
      这个缓冲区
    • slice

      public abstract MappedByteBuffer  slice()
      创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。

      新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。

      新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数,其标记将未定义,其字节顺序将为 BIG_ENDIAN 。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。

      通过在返回缓冲区上调用load() 将字节读入物理内存,或通过在返回缓冲区上调用force() 将字节写入存储设备,只会作用于返回缓冲区代表的该缓冲区的子范围,即 [position(),limit())

      指定者:
      slice 在类 ByteBuffer
      返回:
      新的字节缓冲区
      参见:
    • slice

      public abstract MappedByteBuffer  slice(int index, int length)
      创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。

      新缓冲区的内容将从该缓冲区中的位置 index 开始,并将包含 length 个元素。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。

      新缓冲区的位置将为零,其容量和限制将为 length ,其标记将未定义,其字节顺序将为 BIG_ENDIAN 。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。

      通过在返回缓冲区上调用load() 将字节读入物理内存,或通过在返回缓冲区上调用force() 将字节写入存储设备,将仅作用于返回缓冲区代表的此缓冲区的子范围,即 [index,index+length),其中 indexlength 被假定为满足先决条件。

      指定者:
      slice 在类 ByteBuffer
      参数:
      index - 该缓冲区中新缓冲区内容开始的位置;必须为非负且不大于 limit()
      length - 新缓冲区将包含的元素数;必须为非负且不大于 limit() - index
      返回:
      新缓冲区
    • duplicate

      public abstract MappedByteBuffer  duplicate()
      创建一个共享此缓冲区内容的新字节缓冲区。

      新缓冲区的内容将是该缓冲区的内容。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。

      新缓冲区的容量、限制、位置和标记值将与该缓冲区的相同,其字节顺序将为 BIG_ENDIAN 。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。

      指定者:
      duplicate 在类 ByteBuffer
      返回:
      新的字节缓冲区
    • compact

      public abstract MappedByteBuffer  compact()
      压缩此缓冲区(可选操作).

      缓冲区的当前位置与其限制之间的字节(如果有)被复制到缓冲区的开头。即索引处的字节p= position() 被复制到索引零,索引处的字节p1 被复制到索引 1,依此类推,直到索引 limit() - 1 处的字节被复制到索引nlimit() - 1 -p.缓冲区的位置然后设置为n+1个其限制设置为其容量。标记(如果已定义)将被丢弃。

      缓冲区的位置设置为复制的字节数,而不是零,因此调用此方法后可以立即调用另一个相关方法put方法。

      在从缓冲区写入数据后调用此方法,以防写入不完整。例如,以下循环通过缓冲区 buf 将字节从一个通道复制到另一个通道:

      
        buf.clear();     // Prepare buffer for use
        while (in.read(buf) >= 0 || buf.position != 0) {
          buf.flip();
          out.write(buf);
          buf.compact();  // In case of partial write
        }
        
      指定者:
      compact 在类 ByteBuffer
      返回:
      这个缓冲区