Buffer类的详解(转)

这篇蚊帐转自:,作者写的非常好,是我看到的写nio最好的几篇蚊帐,但原文中有一些错误,还有我自己对这方面的一些理解,在这里一并更改了。

Buffer 类是 java.nio 的构造基础。一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索。缓冲区可以被写满或释放。对于每个非布尔原始数据类型都有一个缓冲区类,即 Buffer 的子类有:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer 和 ShortBuffer,是没有 BooleanBuffer 之说的。尽管缓冲区作用于它们存储的原始数据类型,但缓冲区十分倾向于处理字节。非字节缓冲区可以在后台执行从字节或到字节的转换,这取决于缓冲区是如何创建的。◇ 缓冲区的四个属性        所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息,这四个属性尽管简单,但其至关重要,需熟记于心:

请切记,在使用 Buffer 时,我们实际操作的就是这四个属性的值。我们发现,Buffer 类并没有包括 get() 或 put() 函数。但是,每一个Buffer 的子类都有这两个函数,但它们所采用的参数类型,以及它们返回的数据类型,对每个子类来说都是唯一的,所以它们不能在顶层 Buffer 类中被抽象地声明。它们的定义必须被特定类型的子类所遵从。若不加特殊说明,我们在下面讨论的一些内容,都是以 ByteBuffer 为例,香港虚拟主机,当然,它当然有 get() 和 put() 方法了。 ◇ 相对存取和绝对存取

Java代码

        来看看上面的代码,有不带索引参数的方法和带索引参数的方法。不带索引的 get 和 put,这些调用执行完后,position 的值会自动前进。当然,对于 put,如果调用多次导致位置超出上界(注意,是 limit 而不是 capacity),则会抛出 BufferOverflowException 异常;对于 get,如果位置不小于上界(同样是 limit 而不是 capacity),则会抛出 BufferUnderflowException 异常。这种不带索引参数的方法,称为相对存取,相对存取会自动影响缓冲区的位置属性。带索引参数的方法,称为绝对存取,绝对存储不会影响缓冲区的位置属性,但如果你提供的索引值超出范围(负数或不小于上界),也将抛出 IndexOutOfBoundsException 异常。 ◇ 翻转        我们把 hello 这个串通过 put 存入一 ByteBuffer 中,如下所示:将 hello 存入 ByteBuffer 中

Java代码

        很明显,上面的代码,香港虚拟主机,每次都要判断元素是否到达上界。我们可以做:改变后的释放过程

Java代码

        第二段代码看起来很高效,但请注意,缓冲区并不是多线程安全的。如果你想以多线程同时存取特定的缓冲区,你需要在存取缓冲区之前进行同步。因此,使用第二段代码的前提是,你对缓冲区有专门的控制。 ◇ buffer.clear()        clear() 函数将缓冲区重置为空状态。它并不改变缓冲区中的任何数据元素,而是仅仅将 limit 设为容量的值,并把 position 设回 0。◇ Compact(不知咋翻译,压缩?紧凑?)        有时候,我们只想释放出一部分数据,即只读取部分数据。当然,你可以把 postion 指向你要读取的第一个数据的位置,将 limit 设置成最后一个元素的位置 + 1。但是,一旦缓冲区对象完成填充并释放,它就可以被重新使用了。所以,缓冲区一旦被读取出来,已经没有使用价值了。        以 Mellow 为例,填充后为 Mellow,但如果我们仅仅想读取 llow。读取完后,缓冲区就可以重新使用了。Me 这两个位置对于我们而言是没用的。我们可以将 llow 复制至 0 – 3 上,Me 则被冲掉。但是 4 和 5 仍然为 o 和 w。这个事我们当然可以自行通过 get 和 put 来完成,但 api 给我们提供了一个 compact() 的函数,此函数比我们自己使用 get 和 put 要高效的多。

Compact 之前的缓冲区        buffer.compact() 会使缓冲区的状态图如下图所示:

Compact 之后的缓冲区        这里发生了几件事:

◇ 缓冲区的比较         有时候比较两个缓冲区所包含的数据是很有必要的。所有的缓冲区都提供了一个常规的 equals() 函数用以测试两个缓冲区的是否相等,以及一个 compareTo() 函数用以比较缓冲区。         两个缓冲区被认为相等的充要条件是:

要做一个积极勇敢乐观的追梦人,永远不说消极的话,

Buffer类的详解(转)

相关文章:

你感兴趣的文章:

标签云: