缓冲区 buffer

来源:互联网 发布:微派网络 编辑:程序博客网 时间:2024/05/02 04:45

一种用于特定的基本类型数据的容器。

缓冲区是特定的基本类型元素的线性、有限序列。缓冲区的基本属性除其内容外还包括容量、限制和位置:

缓冲区的容量 是它所包含的元素的数量。缓冲区的容量永远不会为负并且从不会更改。

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

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

每个非 boolean 基本类型都存在此类的一个子类。

传输数据

此类的每个子类都定义了两种 get 和 put 操作:

相对 操作读取或写入从当前位置开始的一个或多个元素,然后将该位置增加传输的元素的数量。如果请求的传输超过了限制,则相对 get 操作将抛出 BufferUnderflowException,相对 put 操作将抛出BufferOverflowException;但无论哪种情况,都不传输数据。

绝对 操作采用显式元素索引,不会影响位置。如果索引参数超过了该限制,则绝对 get 和 put 操作将抛出 IndexOutOfBoundsException

当然,通过适当信道的 I/O 操作还可以将数据传输到缓冲区或从中传出数据(是传入还是传出,通常与当前位置有关)。

做标记和重置

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

不变式

下面的不变式持有标记、位置、限制和容量值:

0 <= 标记 <= 位置 <= 限制 <= 容量

新创建的缓冲区总有一个零位置和一个未定义的标记。初始限制可以为零,也可以是其他某个值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容未定义。

清除、反转和重绕

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

  • clear() 使缓冲区做好了新序列信道读取或相对 put 操作的准备:它将限制设置为容量大小,将位置设置为零。

  • flip() 使缓冲区做好了新序列信道读取或相对 get 操作的准备:它将限制设置为当前位置,然后将该位置设置为零。

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

只读缓冲区

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

线程安全

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

原创粉丝点击