第二章 缓冲区(1)

来源:互联网 发布:笔记本为什么网络受限 编辑:程序博客网 时间:2024/05/21 12:48

第二章 缓冲区

 

所有的事物都是有联系的。

——伟大的爱因斯坦

我们的“观光旅行”将从java.nio包中的Buffer类开始。在java.nio包刚建立时,这些类就成为了包的基础部分。这一章我们将会对这些类进行详细的探讨,找出不同种类的Buffer,并学会怎样去使用它们。然后我们将分析java.nio包中的Buffer类与java.nio.channels中的Channel类的联系。

 

缓冲区(Buffer)是一个固定大小的容器。它通常被当做收集器或者是中转站,数据在这里被存储以备之后被进程取回。就像前面一章所说的那样,数据总是填充到缓冲区中或者被移走。对每一个除了Boolean的基本类型,都有一个对应的缓冲区Buffer类。尽管缓冲区作用于他们保存的基本数据类型,但是缓冲区更倾向于使用字节。非字节的缓冲区能够根据缓冲区创建的方式在背后将数据转换成字节。在这一章节中我们将探讨保存在数据缓冲区中数据的含义。

 

缓冲区(Buffer)是和通道(Channel)紧密联系在一起工作的。通道就像特定数据传输IO的大门,缓冲区就是数据传输的目的地或者出发地。对于向外传输数据,你将你想要传输的数据放入缓冲区,然后将数据传到通道中。对于传入数据,通道将数据放到你提供的缓冲区。在那些相互合作的对象中,缓冲区的数据传输将是高效数据处理的关键。第三章中将会对通道进行详细的探讨。

 

2.1是一个Buffer类的继承关系类图。最上面的是Buffer基类,Buffer定义了所有缓冲区类型的基本操作,不管他们包含的数据类型和他们所特有的行为。Buffer类的基本操作将是我们探讨的出发点。

                                                 2.1 Buffer家族类图

 

2.1 缓冲区基础

 

概念上讲,缓冲区就是一个包装在对象中的基本数据类型的数组。用缓冲区类跟简单的数组相比,好处是它不仅包装了数据内容还包装了数据的信息。缓冲区Buffer类及其子类定义了一套处理缓冲区的API.

 

2.1.1 属性

 

有四个属性是所有的Buffer类都拥有的,这四个属性提供了缓冲区包含的信息。

      

       容量(capacity):

       缓冲区最大能装载的数据量,容量在缓冲类被创建的时候设置,但是不会被改变。

 

       限制(Limit):

       缓冲区的第一个数据不允许读写,换句话说,这里放在缓冲区存储的数据的数量。

 

       位置(Position):

       下一个被读写单元的索引。位置被put()get()方法自动更新。

 

       标记(Mark):

       一个存储的位置。调用mark()设置mark=position。调用reset设置position=mark。标记在设置之前是未定义的。

 

下面的不等式表述了四个属性的关系:

      

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

 

让我们一起看一下这些属性作用的例子。图2.2表示的是一个新创建的容量为10ByteBuffer的逻辑视图。

 

                                   2.2 新创建的ByteBuffer

 

可以看出位置(Position)被设置为0,容量(Capacity)和限制(Limit)被设置为10,标记(Mark)开始是无定义的。除了容量是固定的,其他的属性在被使用的过程中都是可以改变的。

原创粉丝点击