模块  java.base
软件包  java.nio

Class Buffer

  • 已知直接子类:
    ByteBufferCharBufferDoubleBufferFloatBufferIntBufferLongBufferShortBuffer

    public abstract class Buffer
    extends Object
    用于特定基元类型的数据的容器。

    缓冲区是特定基元类型的线性有限元素序列。 除了它的内容,缓冲区的基本属性是它的容量,限制和位置:

    缓冲区的容量是它包含的元素数。缓冲区的容量永远不会消极,永远不会改变。

    缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会超过其容量。

    缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不会为负,并且永远不会超过其限制。

            
            

    每个非布尔基元类型都有这个类的一个子类。

            

    传输数据

            

    此类的每个子类定义了两类得到操作:

            
             

    相对操作从当前位置开始读取或写入一个或多个元素,然后按传输的元素数递增位置。如果请求的传输超过限制,则相对 get 操作将抛出 BufferUnderflowException 和相对 put 操作会抛出 BufferOverflowException ;在任何一种情况下,都不会传输数据。

    绝对操作采用显式元素索引,不影响位置。绝对得到操作抛出一个 IndexOutOfBoundsException < / code> 如果index参数超出限制。

            

    当然,数据也可以通过适当信道的I / O操作传送到缓冲器中或从缓冲器传出,这些操作总是相对于当前位置。

    标记和重置

    缓冲区标记是调用reset方法时其位置将重置的索引 标记并不总是被定义,但是当它被定义时,它永远不会是负数,并且永远不会大于位置。 如果定义了标记,则在将位置或限制调整为小于标记的值时将其丢弃。 如果未定义标记,则调用reset方法会导致抛出InvalidMarkException

    不变

    以下不变量适用于标记,位置,限制和容量值:

    0 <= mark <= position <= limit <= capacity

    新创建的缓冲区始终具有零位置和未定义的标记。 初始限制可以是零,或者它可以是取决于缓冲器的类型和它的构造方式的某个其他值。 新分配的缓冲区的每个元素初始化为零。

    附加操作

    除了访问位置,限制和容量值以及标记和重置的方法之外,此类还在缓冲区上定义了以下操作:

    • clear()为一个新的通道读取或相对放置操作序列准备好缓冲区:它将容量限制和位置设置为零。

    • flip()为一个新的通道写入或相对获取操作序列准备好缓冲区:它设置当前位置的限制,然后将位置设置为零。

    • rewind()使缓冲区准备好重新读取它已包含的数据:它保持限制不变并将位置设置为零。

    • slice()创建缓冲区的子序列:它保持限制和位置不变。

    • duplicate()创建缓冲区的浅表副本:它保留限制和位置不变。

    只读缓冲区

    每个缓冲区都是可读的,但并非每个缓冲区都是可写的。 每个缓冲区类的变异方法被指定为可选操作 ,当在只读缓冲区上调用时,它将抛出ReadOnlyBufferException 只读缓冲区不允许更改其内容,但其标记,位置和限制值是可变的。 可以通过调用其isReadOnly方法来确定缓冲区是否是只读的。

    线程安全

    多个并发线程使用缓冲区是不安全的。 如果要由多个线程使用缓冲区,则应通过适当的同步来控制对缓冲区的访问。

    调用链接

    此类中没有返回值的方法被指定为返回调用它们的缓冲区。 这允许方法调用被链接; 例如,语句序列

     b.flip();
     b.position(23);
     b.limit(42);
    可以用单一,更紧凑的语句代替
     b.flip().position(23).limit(42);
    从以下版本开始:
    1.4
    • 方法详细信息

      • capacity

        public final int capacity()
        返回此缓冲区的容量。
        结果
        这个缓冲区的容量
      • position

        public final int position()
        返回此缓冲区的位置。
        结果
        这个缓冲区的位置
      • position

        public Buffer position​(int newPosition)
        设置此缓冲区的位置。 如果标记已定义且大于新位置,则将其丢弃。
        参数
        newPosition - 新的头寸价值; 必须是非负的且不大于当前限制
        结果
        这个缓冲区
        异常
        IllegalArgumentException -如果前提 newPosition不成立
      • limit

        public final int limit()
        返回此缓冲区的限制。
        结果
        这个缓冲区的限制
      • limit

        public Buffer limit​(int newLimit)
        设置此缓冲区的限制。 如果该位置大于新限制,则将其设置为新限制。 如果标记已定义且大于新限制,则将其丢弃。
        参数
        newLimit - 新的限制值; 必须是非负的且不大于此缓冲区的容量
        结果
        这个缓冲区
        异常
        IllegalArgumentException -如果前提 newLimit不成立
      • mark

        public Buffer mark()
        在此位置设置此缓冲区的标记。
        结果
        这个缓冲区
      • reset

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

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

        结果
        这个缓冲区
        异常
        InvalidMarkException - 如果尚未设置标记
      • clear

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

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

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

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

        结果
        这个缓冲区
      • flip

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

        结果
        这个缓冲区
      • rewind

        public Buffer rewind()
        倒回这个缓冲区。 位置设置为零,标记被丢弃。

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

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

        public final int remaining()
        返回当前位置和限制之间的元素数。
        结果
        此缓冲区中剩余的元素数
      • hasRemaining

        public final boolean hasRemaining()
        告知当前位置和限制之间是否存在任何元素。
        结果
        true if且且仅当此缓冲区中至少有一个元素剩余时
      • isReadOnly

        public abstract boolean isReadOnly()
        判断此缓冲区是否为只读。
        结果
        true当且仅当此缓冲区为只读时
      • hasArray

        public abstract boolean hasArray()
        判断此缓冲区是否由可访问的数组支持。

        如果此方法返回true则可以安全地调用arrayarrayOffset方法。

        结果
        true当且仅当此缓冲区由数组支持且不是只读时
        从以下版本开始:
        1.6
      • array

        public abstract Object array()
        返回支持此缓冲区的数组(可选操作)

        此方法旨在允许更高效地将阵列支持的缓冲区传递给本机代码。 具体子类为此方法提供更强类型的返回值。

        修改此缓冲区的内容将导致返回的数组内容被修改,反之亦然。

        在调用此方法之前调用hasArray方法,以确保此缓冲区具有可访问的后备阵列。

        结果
        支持此缓冲区的数组
        异常
        ReadOnlyBufferException - 如果此缓冲区由数组支持但是只读
        UnsupportedOperationException - 如果此缓冲区未由可访问的数组支持
        从以下版本开始:
        1.6
      • arrayOffset

        public abstract int arrayOffset()
        返回此缓冲区缓冲区第一个元素的后备数组中的偏移量(可选操作)

        如果此缓冲区由数组支持,则缓冲区位置p对应于数组索引p + arrayOffset()

        在调用此方法之前调用hasArray方法,以确保此缓冲区具有可访问的后备阵列。

        结果
        缓冲区第一个元素的缓冲区数组中的偏移量
        异常
        ReadOnlyBufferException - 如果此缓冲区由数组支持但是只读
        UnsupportedOperationException - 如果此缓冲区未由可访问的数组支持
        从以下版本开始:
        1.6
      • isDirect

        public abstract boolean isDirect()
        判断此缓冲区是否为 direct
        结果
        true当且仅当此缓冲区是直接的
        从以下版本开始:
        1.6
      • slice

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

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

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

        结果
        新的缓冲区
        从以下版本开始:
        9
      • duplicate

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

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

        新缓冲区的容量,限制,位置和标记值将与此缓冲区的容量,限制,位置和标记值相同。 当且仅当此缓冲区是直接缓冲区时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读时,它才是只读的。

        结果
        新的缓冲区
        从以下版本开始:
        9