Module  java.base
软件包  java.nio

Class MappedByteBuffer

  • All Implemented Interfaces:
    Comparable<ByteBuffer>


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

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

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

    映射字节缓冲区的内容可以随时更改,例如,如果该程序或其他映射文件的对应区域的内容被更改。 这种变化是否发生,何时发生,是操作系统依赖的,因此是未指定的。

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

    映射的字节缓冲区的行为与普通的直接字节缓冲区不同。

    从以下版本开始:
    1.4
    • 方法详细信息

      • isLoaded

        public final boolean isLoaded​()
        告诉这个缓冲区的内容是否驻留在物理内存中。

        返回值为true意味着该缓冲区中的所有数据很可能驻留在物理内存中,因此可能会被访问,而不会导致任何虚拟内存页面错误或I / O操作。 返回值为false不一定意味着缓冲区的内容不驻留在物理内存中。

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

        结果
        true如果这个缓冲区的内容很可能驻留在物理内存中
      • load

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

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

        结果
        这个缓冲区
      • force

        public final MappedByteBuffer force​()
        强制将此缓冲区内容的任何更改写入包含映射文件的存储设备。

        如果映射到此缓冲区的文件驻留在本地存储设备上,那么当此方法返回时,将保证自从创建缓冲区以来所做的所有更改,或自上次调用该方法后,都将被写入该设备。

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

        如果此缓冲区未以读/写模式映射( FileChannel.MapMode.READ_WRITE ),则调用此方法将不起作用。

        结果
        这个缓冲区
      • position

        public final MappedByteBuffer position​(int newPosition)
        设置这个缓冲区的位置。 如果标记被定义并且大于新位置,则它被丢弃。
        重写:
        positionByteBuffer
        参数
        newPosition - 新的位置值 必须是非负数,不得大于当前限制
        结果
        这个缓冲区
      • limit

        public final MappedByteBuffer limit​(int newLimit)
        设置此缓冲区的限制。 如果位置大于新的限制,那么它被设置为新的限制。 如果标记被定义并且大于新限制,则它被丢弃。
        重写:
        limitByteBuffer
        参数
        newLimit - 新限制值; 必须是非负数,不大于此缓冲区的容量
        结果
        这个缓冲区
      • reset

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

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

        重写:
        resetByteBuffer
        结果
        这个缓冲区
      • clear

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

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

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

        该方法实际上并不会清除缓冲区中的数据,而是将其命名为它的确因为它最常用于情况也是如此。

        重写:
        clearByteBuffer
        结果
        这个缓冲区
      • flip

        public final MappedByteBuffer flip​()
        翻转这个缓冲区。 该限制设置为当前位置,然后将该位置设置为零。 如果标记被定义,则它被丢弃。

        在通道读取或放置操作的序列之后,调用此方法来准备一系列通道写入或相对获取操作。 例如:

         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方法结合使用。

        重写:
        flipByteBuffer
        结果
        这个缓冲区
      • rewind

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

        在通道写入或获取操作的序列之前调用此方法,假设已经设置了相应的限制。 例如:

         out.write(buf);    // Write remaining data
         buf.rewind();      // Rewind buffer
         buf.get(array);    // Copy data into array
        重写:
        rewindByteBuffer
        结果
        这个缓冲区