Buffer 是固定大小的数据的容器, 其作用是一个存储器, 或者分段运输区, 在这里数据可被存储并在之后用于检索. 缓冲区的工作与通道紧密联系, 待传递出去的数据被置于一个缓冲区, 被传送到通道; 待传回的缓冲区的传输, 一个通道将数据放置在所提供的缓冲区中. 这种在协同对象之间进行的缓冲区数据传递是高效数据处理的关键.
Buffer 类的层次图
下图是 Buffer 类的层次图. 在顶部是通用 Buffer 类, Buffer 定义所有缓冲区类型共有的操作, 无论是它们所包含的数据类型还是可能具有的特定行为:
Buffer 的属性
缓冲区是包在一个对象内的基本数据元素数组. Buffer 类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中, Buffer 类以及它专有的子类定义了一个用于处理数据缓冲区的 API. 所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息:
属 性 | 作 用 |
---|---|
capacity | 容量,指缓冲区能够容纳的数据元素的最大数量,这一容量在缓冲区创建时被设定,并且永远不能被改变 |
limit | 上界,指缓冲区的第一个不能被读或写的元素,或者说是,缓冲区中现存元素的计数 |
position | 位置,指下一个要被读或写的元素的索引,位置会自动由相应的 get() 和 put() 函数更新 |
mark | 标记,指一个备忘位置,调用 mark() 来设定 mark=position,调用 reset() 来设定 postion=mark,标记未设定前是未定义的 |
下面简单介绍几个常用方法调用后, 属性的变化. 开辟一个起始容量为 10 的缓冲区:
put() 方法
flip() 方法, 将 Buffer 从写模式切换到读模式
image.PNG
rewind() 方法, 将 position 设回 0,limit 保持不变, 用于重读 Buffer 中的所有数据
Buffer 读写模式下属性的变化
Buffer 的使用
最后以一段代码, 简单介绍以下 Buffer 的使用
- public class TestMain
- {
- /**
- * 待显示的字符串
- */
- private static String[] strs =
- {
- "Hello World"
- };
- /**
- * 标识 strs 的下标索引
- */
- private static int index = 0;
- /**
- * 向 Buffer 内放置数据
- */
- private static boolean fillBuffer(CharBuffer buffer)
- {
- if (index>= strs.length)
- return false;
- String str = strs[index++];
- for (int i = 0; i < str.length(); i++)
- {
- buffer.put(str.charAt(i));
- }
- return true;
- }
- /**
- * 从 Buffer 内把数据拿出来
- */
- private static void drainBuffer(CharBuffer buffer)
- {
- while (buffer.hasRemaining())
- {
- System.out.print(buffer.get());
- }
- System.out.println("");
- }
- public static void main(String[] args)
- {
- CharBuffer cb = CharBuffer.allocate(100);
- while (fillBuffer(cb))
- {
- cb.flip();
- drainBuffer(cb);
- cb.clear();
- }
- }
- }
来源: http://www.jianshu.com/p/2e1dede10609