Java NIO(New I/O)的三个属性position、limit、capacity

来源:互联网 发布:传智软件科技有限公司 编辑:程序博客网 时间:2024/05/19 13:13

在缓冲区中,最重要的属性有下面三个,它们一起合作完成对缓冲区内部状态的变化跟踪:

position:指定了下一个将要被写入或者读取的元素索引,它的值由get()/put()方法自动更新,在新0

创建一个Buffer对象时,position被初始化为0。

limit:指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。

capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量。

以上四个属性值之间有一些相对大小的关系:0 <= position <= limit <= capacity。如果我们创建一个新的容量大小为10的ByteBuffer对象,在初始化的时候,position设置为0,limit和capacity被设置为10,在以后使用ByteBuffer对象过程中,capacity的值不会再发生变化,而其它两个个将会随着使用而变化。

现在我们可以从通道中读取一些数据到缓冲区中,注意从通道读取数据,相当于往缓冲区中写入数据。如果读取4个自己的数据,则此时position的值为4,即下一个将要被写入的字节索引为4,而limit仍然是10,如下图所示:

下一步把读取的数据写入到输出通道中,相当于从缓冲区中读取数据,在此之前,必须调用flip()方法,该方法将会完成两件事情:

1. 把limit设置为当前的position值 
2. 把position设置为0

由于position被设置为0,所以可以保证在下一步输出时读取到的是缓冲区中的第一个字节,而limit被设置为当前的position,可以保证读取的数据正好是之前写入到缓冲区中的数据,如下图所示:

现在调用get()方法从缓冲区中读取数据写入到输出通道,这会导致position的增加而limit保持不变,但position不会超过limit的值,所以在读取我们之前写入到缓冲区中的4个自己之后,position和limit的值都为4,如下图所示:

在从缓冲区中读取数据完毕后,limit的值仍然保持在我们调用flip()方法时的值,调用clear()方法能够把所有的状态变化设置为初始化时的值,如下图所示:

最后我们用一段代码来验证这个过程,如下所示:

import java.io.*;
  import java.nio.*;
  import java.nio.channels.*;

  public class Program {
      public static void main( String args[] ) throws Exception {
          FileInputStream fin = new FileInputStream("c:\\test.txt");
          FileChannel fc = fin.getChannel();
          
          ByteBuffer buffer = ByteBuffer.allocate(10);
          output("初始化", buffer);
          
          fc.read(buffer);
          output("调用read()", buffer);
          
          buffer.flip();
          output("调用flip()", buffer);
          
          while (buffer.remaining()>0) {
              byte b = buffer.get();
              //System.out.print(((char)b));
          }
          output("调用get()", buffer);
          
          buffer.clear();
          output("调用clear()", buffer);
          
          fin.close();
      }
      
      public static void output(String step, Buffer buffer)
      {
          System.out.println(step + " : ");
          System.out.print("capacity: " + buffer.capacity() + ", ");
          System.out.print("position: " + buffer.position() + ", ");
          System.out.println("limit: " + buffer.limit());
          System.out.println();
      }
  }

完成的输出结果为:

初始化 : 
   capacity: 10, position: 0, limit: 10

   调用read() : 
   capacity: 10, position: 4, limit: 10

   调用flip() : 
   capacity: 10, position: 0, limit: 4

   调用get() : 
   capacity: 10, position: 4, limit: 4

   调用clear() : 
   capacity: 10, position: 0, limit: 10
  

这与我们上面演示的过程一致。在后面的文章中,我们继续介绍NIO中关于缓冲区一些更高级的使用。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑开机键盘鼠标没反应怎么办 玩gta4自由城卡怎么办 gta5游戏服务当前不可用怎么办 健身后胳膊变粗怎么办 健身后手臂变粗怎么办 家猫见到我就跑怎么办 走路多了小腿酸痛怎么办 脚有脚气很痒怎么办 地板精油喷多了怎么办 史莱姆泥变硬了怎么办 dnf剑帝命中率低怎么办 无意中讲话伤害了人怎么办 高中上不下去了怎么办 高三坚持不下去怎么办 word点了不保存怎么办 做了ppt没保存怎么办 中班安全教案迷眼了怎么办 美的空调尘满怎么办 高考报名系统密码忘记怎么办 高考理综8题怎么办 高三了语文很差怎么办 高三了语文成绩差怎么办 供太岁初一忘了怎么办 高一英语100多分怎么办 高一孩子英语差怎么办 高考中题目有错别字怎么办 相亲简单自我介绍后不回我怎么办 初中毕业没考上高中怎么办 幼儿园小朋友经常说脏话幼师怎么办 我不想当组长了怎么办 领导让我做组长怎么办 情人抓住把柄敲诈自己老公怎么办 我太看重朋友了怎么办 初中生下面长硬胡子痒怎么办 孩子不爱与人沟通怎么办 初一初二没学好初三怎么办 打印机提示存储已满怎么办 苹果6内存满了怎么办 手机总显示存储空间不足怎么办 我爱她她不爱我怎么办 孩子爱发脾气·父母怎么办