JAVA NIO - 缓冲区

152 阅读3分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

Java NIO 缓冲区

概念上,缓冲区是包在一个对象内的基本数据元素数组。Buffer类相比一个简单数组的有点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buffer类以及它专有的子类定义了一个用于处理数据缓冲区的API

所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息。它们是:

容量(Capacity

缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。

上界(Limit

缓冲区的第一个不能被读或者写的元素。或者说,缓冲区中现存元素的计数。

位置(Position

下一个要被读或者写的元素的索引。位置会自动由相应的get()put()函数更新。

标记(Mark

一个备忘位置。调用mark()来设定mark = position。调用reset()设定 position = mark。标记在设定前是未定义的(Undefined)。

缓冲区的分类:

字节缓冲区 ByteBuffer

字符缓冲区 CharBuffer

双精浮点型(double)缓冲区 DoubleBuffer

单精浮点型(float)缓冲区 FloatBuffer

整型(int)缓冲区 IntBuffer

长整型(long)缓冲区 LongBuffer

短整型(short)缓冲区 ShortBuffer

上述的各类型的缓冲区都提供了读和写的方法 getput方法,也提供了一批量的putget方法。而且缓冲区可以通过allocation创建,此方法通过wrapping讲一个现有(数据类型)数组包装到缓冲区中来为缓冲区内容分配空间,或者通过创建现有字节缓冲区的视图来创建。

java.nio软件包中有七种主要的缓冲区类,每一种都具有Java语言中的非布尔类型的原始类型数据。这些类没有一种能够直接实例化。它们都是抽象类,但是都包含静态工厂方法用来创建响应类的新实例。

虽然有七种类型的缓冲区类,但是他们的创建方式基本都是类似的。

新的缓冲区是由分配或者包装操作创建的。分配操作创建一个缓冲区对象并分配一个私有的空间来存储容量大小的数据元素。包装操作创建一个缓冲区对象但是不分配任何空间来存储数据元素。它使用您所提供的数组作为存储空间来存储缓冲区中的数据元素。

如果你想提供自己的数组用做缓冲区的备份存储器,请调用wrap()函数

通过allocate()或者wrap()函数创建的缓冲区通常都是间接的。间接的缓冲区使用备份数组。

复制缓冲区

Duplicate()函数创建了一个 与原始缓冲区相似的新缓冲区。两个缓冲区共享数据元素,拥有同样的容量,但是每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上。这一副本缓冲区具有与原始缓冲区同样的数据视图。如果原始的缓冲区为只读,或者为直接缓冲区,新的缓冲区将继承这些属性。

注意:复制一个缓冲区会创建一个新的Buffer对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据元素。