造价通

反馈
取消

热门搜词

造价通

取消 发送 反馈意见

缓冲器Java语言中的缓冲器

2022/07/13115 作者:佚名
导读:缓冲器Buffer java.nio.Buffer直接已知子类:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBufferpublic abstract classBufferextendsObject一个用于特定基本类型数据的容器。 缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属

缓冲器Buffer

java.nio.Buffer直接已知子类:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBufferpublic abstract classBufferextendsObject一个用于特定基本类型数据的容器。

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

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

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

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

对于每个非 boolean 基本类型,此类都有一个子类与之对应。

缓冲器传输数据

此类的每个子类都定义了两种获取放置操作:

相对操作读取或写入一个或多个元素,它从当前位置开始,然后将位置增加所传输的元素数。如果请求的传输超出限制,则相对获取操作将抛出BufferUnderflowException,相对放置操作将抛出BufferOverflowException;这两种情况下,都没有数据被传输。

绝对操作采用显式元素索引,该操作不影响位置。如果索引参数超出限制,绝对获取操作和放置操作将抛出IndexOutOfBoundsException。

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

缓冲器做标记和重置

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

缓冲器不变式

标记、位置、限制和容量值遵守以下不变式:

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

缓冲器清除反转重绕

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

clear()使缓冲区为一系列新的通道读取或相对放置操作做好准备:它将限制设置为容量大小,将位置设置为 0。

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

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

缓冲器只读缓冲区

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

缓冲器线程安全

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

缓冲器调用链

指定此类中的方法返回调用它们的缓冲区(否则它们不会返回任何值)。此操作允许将方法调用组成一个链;例如,语句序列

b.flip(); b.position(23); b.limit(42);可以由以下更紧凑的一个语句代替 b.flip().position(23).limit(42);

从以下版本开始:1.4

*文章为作者独立观点,不代表造价通立场,除来源是“造价通”外。
关注微信公众号造价通(zjtcn_Largedata),获取建设行业第一手资讯

热门推荐

相关阅读