前篇可知Buffer是和Chanel配套使用的,Chanel从Buffer中读数据,将数据写入Buffer.Buffer的实质是块内存,被包装成JAVA Object并提供基础方法使我们可以更简单的使用。

熟悉一下三个属性有助于我们理解Buffer是怎样工作的:

  • capacity 容量
  • position  位置
  • limit         界限

这三个属性的在Buffer读和写模式下的意义如图:

Buffer capacity, position and limit in write and read mode.

Capacity

Buffer是一块内存,其有固定的大小,我们将这个大小表示为Capacity 我们只能写入这个大小的数据进来,如果Buffer满了,我们必须通过read或者clear方法清空空间才能继续写入。

Position

将数据写入Buffer时,positiion会被初始化为0,随后每写入一位+1,最大可以达到capacity-1的位置。我们可以使用filp方法将Buffer从写模式转为读模式,此时每读出一位+1;

Limit

写模式时,Limit表示我们可以写入多少位数据,此时这个值与capacity值是相当的。

读模式时,该值表示我们可以读多少位数据,当我们将写模式转为读模式时,limit值会被设为当时的position值。

有很多种Buffer实现,如下:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

我们可以使用如下的allocate方法获得一个Buffer对象并为其分配内存空间

ByteBuffer buf = ByteBuffer.allocate(48);

写入Buffer

有两种方法

  1. 使用Chanel写入
  2. 使用Buffer的put方法

法一,将Chanel(数据源)中的数据读入Buffer(缓存区

int bytesRead = inChannel.read(buf); //read into buffer.

法二,调用put方法,该方法有多种变种

buf.put(127);    

flip()

如上文所述,filp()方法可以让Buffer从写模式转为读模式,也就是将limit位置设为position位置,将position位置置0.然后我们就可以从position位置开始读Buffer。

读出Buffer

同样有两种方法

  1. 将Buffer数据读入Channel
  2. 调用Buffer自带的get方法

法1:将Buffer数据读出到channel中(对于channel来说是写入channel,对Buffer当然是读出)

//read from buffer into channel.
int bytesWritten = inChannel.write(buf);

法2:get方法,该方法有多种变种

byte aByte = buf.get();    

rewind()

将position置0。

clear() and compact()

可以调用clear或者compact方法来清空Buffer。

clear方法:position置0,limit置于capacity值。也就是回到Buffer刚分配的状态。

compact方法:如果还有未读的数据在Buffer中,将这些未读数据移至Buffer起点,将position放在最后一个未读数据后面,这样写新数据时就不会覆盖旧数据。

mark() and reset()

实际上buffer中还有一个临时标记位变量mark,mark的值必须小于或等于position。mark方法可以将mark值设为position值,调用reset方法可以将position值回复到标记的位置(也就是mark值)

buffer.mark();//call buffer.get() a couple of times, e.g. during parsing.buffer.reset();  //set position back to mark.

equals() and compareTo()

equal的要求是Buffer同类,Buffer大小相等,Buffer内全部元素相等。

compareTo,逐一比较Buffer内元素大小,如果比不出来就看哪个Buffer先取光元素

【每日一篇】NIO学习【二】什么是Buffer相关推荐

  1. NIO学习笔记——缓冲区(Buffer)详解

    缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比一个简单的数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中. Buffer的属性 容量(capacity):缓冲区能够容纳的数 ...

  2. Java NIO学习系列一:Buffer

    从本文开始我会开始总结NIO部分,Java NIO(注意,这里的NIO其实叫New IO)是用来替换标准Java IO以及Java 网络API的,其提供了一系列不同与标准IO API的方式来处理IO, ...

  3. Java NIO(二)缓冲区Buffer

    本文以CharBuffer为例,运行下代码结合注释看,有一个要点是无论什么操作,capacity不会变. 1.Buffer基本属性 public void testProperties(){CharB ...

  4. Java NIO学习篇之直接缓冲区和非直接缓冲区

    定义 以上是书深入理解java虚拟机对直接内存的描述.直接缓冲区用的就是直接内存. java nio字节缓冲区要么是直接的,要么是非直接的.如果为直接字节缓冲区,则java虚拟机会尽最大努力直接在此缓 ...

  5. Java NIO学习篇之通道FileChannel详解

    定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道. 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作. * ...

  6. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  7. LINUX学习基础篇(十二)痕迹命令

    LINUX学习基础篇(十二)痕迹命令 系统痕迹命令 w命令 who命令 last命令 lastlog命令 lastb命令 系统痕迹命令 系统中有一些重要的痕迹日志文件,如/var/log/wtmp./ ...

  8. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. JAVA NIO学习一:NIO简介、NIOIO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  10. [Qt教程] 第22篇 数据库(二)编译MySQL数据库驱动

    [Qt教程] 第22篇 数据库(二)编译MySQL数据库驱动 楼主  发表于 2013-5-13 21:28:02 | 查看: 1616| 回复: 12 编译MyQSL数据库驱动 版权声明 该文章原创 ...

最新文章

  1. 浅谈25种设计模式(4/25)(此坑未填)
  2. 用CSS实现梯形图标
  3. LNMP(php-fpm的pool,慢执行日志,定义open_bashdir,php-fpm进程管理
  4. android使用tabhost实现导航
  5. 除了Open Day,Nibiru与DigiArtist来CJ 搞事情了
  6. java群发图文消息_使用Java语言开发微信公众平台(四)——图文消息的发送与响应...
  7. Java编程基础阶段笔记 day04 Java基础语法(下)
  8. ovs 下流表port 1进入,port 1出去
  9. glassfish启动后不能进入部署页面_Flink on Yarn三部曲之二:部署和设置
  10. HTTP协议&SOCKET协议
  11. android 远程windows7,将Android手机屏幕快速投影至WIN7的PC和投影仪
  12. 【C#进阶3-7】C# Socket通讯
  13. 制作WINDOWS图标
  14. word 2007 删除表格内容
  15. RuntimeError: non-empty 3D or 4D input tensor expected but got ndim: 4
  16. 2019 快手校招编程题两道解答
  17. struts2 框架升级从2.3.*,升级到2.5.30
  18. 操作系统的类型与结构---定义与分类
  19. python爬虫框架feapder的使用简介
  20. 二层广播(帧广播)和三层广播(路由器广播)有什么区别?

热门文章

  1. 从微信端跳到外部浏览器进行apk文件下载
  2. 树莓派4B与Android之缘——树莓派下LineageOS(Android 9)系统开机联网与远程控制
  3. 一些“不正规”的软件项目招标前小技巧
  4. 如何用计算机破解ipad,ipad解id锁方法介绍【图文】】
  5. 量化交易学习系列13-系统交易的职业道路是什么
  6. 第3课:Scratchjr功能按钮
  7. php swoft 应用,Swoole 在 Swoft 中的应用
  8. 阿里云部署开源IPPBX系统
  9. 神器IDM | 不限速下载到底有多快?
  10. 模拟鼠标键盘html,模拟按键操作神器(鼠标键盘模拟操作助手)V2.0.2.1 正式版