北大青鸟光谷校区

北大青鸟光谷校区

  • 北大青鸟徐东校区
  • 北大青鸟光谷校区
  • 北大青鸟高新校区
  • 荆州青鸟之家
  • 襄阳青鸟之家

17740513250

百日千才

java入门课程学习-缓解buffer的细节问题

发布日期:2023-03-31来源:武汉北大青鸟武汉校区作者:武汉宏鹏

        学java没有基础怎么办?没关系,北大青鸟武汉宏鹏光谷校区java入门技术会一步步带领你了解java,下面是有关缓解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技术课程会为你带来新的java技术,学java,请关注武汉北大青鸟官网。学习热线:17740513250

关闭

只为了方便您就学 北大青鸟光谷校区 北大青鸟武汉校区

武汉市洪山区珞喻路724号(地铁二号线光谷广场站F口出

Copyright (c) 2006-2023 武汉宏鹏教育咨询有限公司 版权所有 All Rights Reserved.