缓冲器(Buffer)的细节

本文深入探讨Java NIO中的缓冲区(Buffer),介绍其核心概念包括容量、位置、界限及标记等索引的作用与意义,并通过示例代码展示如何利用这些索引进行高效的数据访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓冲器(Buffer)的细节


  从上面继承图层来看,了解Buffer很重要。 Buffer=数据+四个索引 正是四个索引才是的数据可以高效访问,这四个索引是:mark(标记),position(位置),limit(界限),capacity(容量)。 不变式标记、位置、限制和容量值遵守以下不变式:0 <= 标记 <= 位置 <= 限制 <= 容量  以下是设置和复位索引以及查询的方法:                             capacity() :返回此缓冲区的容量。                                  clear() :清除此缓冲区。                                     flip() :反转此缓冲区。                                    limit() :返回此缓冲区的限制。                   limit(int newLimit) :设置此缓冲区的限制。                                   mark() :在此缓冲区的位置设置标记。                               position() :返回此缓冲区的位置。          position(int newPosition) :设置此缓冲区的位置。                             remaining() :返回当前位置与限制之间的元素数。                                    reset() :将此缓冲区的位置重置为以前标记的位置。                                  rewind() :重绕此缓冲区。  通过代码查看:[java]  package org.com.mayi;    import java.nio.ByteBuffer;  import java.nio.CharBuffer;    public class Test_ByteBuffer {      static int capacity1,limit1,position1;      /**      * @param args      */      public static void main(String[] args){          byte[] b = "my test".getBytes();//获取字节数组          ByteBuffer bytebuffer =ByteBuffer.allocate(15);//定义一个buffer,并为之分配容量。          bytebuffer.put(b);//把字节放进buffer                      capacity1 = bytebuffer.capacity();//返回buffer容量            limit1 = bytebuffer.limit();//返回buffer界限            position1 = bytebuffer.position();//返回buffer位置            /*没有设置mark(标记), */           System.out.println("容量:"+capacity1+"    界限:"+limit1+"   位置: "+position1+"    mark:"+"需要自己设置");                     //反转此缓冲区,从结果来看,我们知道,capacity不变,limit=position  ;position=0;           //此时的buffer感觉就像队列一样,先进先出。           bytebuffer.flip();           capacity1 = bytebuffer.capacity();            limit1 = bytebuffer.limit();            position1 = bytebuffer.position();           System.out.println("容量:"+capacity1+"    界限:"+limit1+"   位置: "+position1+"    mark:"+"需要自己设置");                      //重绕此缓冲区,其实就是相当于刷新一下,通知buffer做好读或写的准备,并没有什么改变。           bytebuffer.rewind();           capacity1 = bytebuffer.capacity();            limit1 = bytebuffer.limit();            position1 = bytebuffer.position();           System.out.println("容量:"+capacity1+"    界限:"+limit1+"   位置: "+position1+"    mark:"+"需要自己设置");        }    }    输出:[java] 容量:15    界限:15   位置: 7    mark:需要自己设置  容量:15    界限:7   位置: 0    mark:需要自己设置  容量:15    界限:7   位置: 0    mark:需要自己设置    通过查看API文档,又找到一些官方解释:哈哈。。。清除、反转和重绕除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定义了以下可对缓冲区进行的操作:clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。 理解了这四个索引的工作是很重要的,做到数据输入输出时,缓冲区在干什么,心中有数,不至于茫茫然,看别人的代码这样写,你也稀里糊涂的跟着写了。如果有兴趣,可以查看《java编程思想》的NIO那一章,有很详细的解释,里面是图文结合,比我的好多了。我在这里写下,也只是做一个简单笔记罢了。。









以下是设置和复位索引以及查询的方法:                        

   capacity() :返回此缓冲区的容量。                           

      clear() :清除此缓冲区。                             

       flip() :反转此缓冲区。                          

        limit() :返回此缓冲区的限制。          

       limit(int newLimit) :设置此缓冲区的限制。                       

           mark() :在此缓冲区的位置设置标记。                         

     position() :返回此缓冲区的位置。    

     position(int newPosition) :设置此缓冲区的位置。                     

      remaining() :返回当前位置与限制之间的元素数。                      

             reset() :将此缓冲区的位置重置为以前标记的位置。                

                 rewind() :重绕此缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值