Java NIO之Buffer

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();
         }
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值