第二章 缓冲区(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表示的是一个新创建的容量为10的ByteBuffer的逻辑视图。
图2.2 新创建的ByteBuffer
可以看出位置(Position)被设置为0,容量(Capacity)和限制(Limit)被设置为10,标记(Mark)开始是无定义的。除了容量是固定的,其他的属性在被使用的过程中都是可以改变的。
- 第二章 缓冲区(1)
- 第二章 缓冲区(2)
- 第二章 缓冲区(4)
- 第二章 缓冲区(5)
- 第二章 缓冲区(6)
- 第二章 缓冲区(7)
- 第二章 缓冲区(8)
- 第二章 缓冲区(9)
- 第二章 缓冲区(10)
- 第二章 缓冲区(11)
- 第二章 缓冲区(12)
- 第二章 缓冲区(13)
- 读书笔记-《Java NIO》:第二章 缓冲区(1)
- 读书笔记-《Java NIO》:第二章 缓冲区(2)
- 缓冲区系列(1)
- 缓冲区系列(1)
- 缓冲区溢出(1)
- 第三章 缓冲区(3)
- 名人故事:少年黑客艾伦与盖茨
- ASP.NET MVC 项目中使用 WebForm
- 设计模式之AbstractFactory模式
- 数据结构之查找
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 第二章 缓冲区(1)
- 查看本机端口的使用情况
- iphone开发实例 SQLite数据库使用
- 递归函数生成排列
- GetWindowRect GetClientRect
- 60 条老外眼中中国人标签
- 端口号
- 分治的实现::递归程序设计
- C/S(客户端、服务器端)的知识