ByteBuffer的常用属性

1.position 标识下一个byte的操作位

2.limit 标识上界

3.capacity 标识容量

4.mark 辅助标识

ByteBuffer的常用函数

ByteBuffer.allocate(250) -- 新建byteBuffer

bb.wrap(new byte[100]) -- 新建byteBuffer

put方法写 -- 入缓冲区

get方法  -- 读取缓冲区

flip方法 反转 -- 用于从写入到读取的操作,将position为0,limit为原position

compact方法 --  压缩,舍弃position之前的内容

mark()  --  标志position

reset() --  重新设置position为当初的mark值

对于ByteBuffer主要需要注意的是几个标志的含义:position,limit,capability,mark.几个操作的影响:flip(),clear(),rewind().还有就是在读取或者写入时,标志的变化,比如get()方法导致position加1.

SocketChannel采用的是非阻塞异步读取流数据,在读取的时候,通常是

 
  1. ByteBuffer.clear();
  2. SocketChannel.read(ByteBuffer);

如果流中有数据,就会把数据从position开始读到ByteBuffer中,在读取之前ByteBuffer的clear操作会把position置为0,limit置为capability,也就是相当于清空了之前的内容,但是ByteBuffer中数组的内容在read之前是没有改变的.

read之后,通常就是开始从ByteBuffer中提取读到的数据,如果你的数据是以自己定义的数据包的格式进行发送的,那你还需要判断是否读到了数据包的结尾,因为对流数据本身来说是没有结尾这一说的。在提取数据之前,要先把position放到开始读取时的位置,把limit放到当前位置,所以要flip一下,表示从position到limit的位置都是需要的数据。

 
  1. ByteBuffer.flip();
  2. while(ByteBuffer.hasRemaining()){
  3. byte c=ByteBuffer.get();
  4. if (b == PACKAGE_END) {
  5. //you can return the package here
  6. }else{
  7. //you can append the byte here.like StringBuilder.append().
  8. }
  9. }

这样以来也存在一个问题,当一次读到的ByteBuffer不包含完整的数据包或者包含多个数据包.那么就需要在下一次继续把这些包分拆出来.那么在读取数据的代码处就可以改为,这样就把之前读取到的未完整的包保留了下来:

 
  1. if(!ByteBuffer.hasRemaining){
  2. ByteBuffer.clear();
  3. SocketChannel.read(ByteBuffer);
  4. }

另外一个可能会用到的操作就是ByteBuffer.rewind(),他会把position置为0,limit保持不变,可以用于重复读取一段数据.

ByteBuffer是nio中一个非常方便的工具.设计思想也非常值得借鉴.

一手文档可以参考jdk api doc中的 java.nio.Buffer和 java.nio.ByteBuffer

Java ByteBuffer用法相关推荐

  1. java.nio.ByteBuffer用法小结

    转载自  java.nio.ByteBuffer用法小结 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入 ...

  2. Java ByteBuffer –速成课程

    以我的经验,当开发人员第一次遇到java.nio.ByteBuffer时,会引起混乱和细微的错误,因为如何正确使用它尚不明显. 在我对API文档感到满意之前,需要反复阅读API文档和一些经验以实现一些 ...

  3. java resume过时方法_学点开发|关于Java多线程用法解析

    在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...

  4. java正则表达式用法示例_Java正则表达式教程及示例

    java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...

  5. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  6. java反射用法示例_Java包| 类型,用法,示例

    java反射用法示例 配套 (Packages) Packages in Java is simply a mechanism to encapsulate (i.e. to put in a sho ...

  7. java反射用法示例_Java反射示例教程

    java反射用法示例 Java Reflection provides ability to inspect and modify the runtime behavior of applicatio ...

  8. Java SimpleDateFormat用法

    1. SimpleDateFormat类 SimpleDateFormat是一个日期格式化类,用来格式化日期. // 构造方法 public SimpleDateFormat(String patte ...

  9. Java split()用法,使用特殊字符要注意了

    Java split()用法,使用特殊字符要使用转义字符. 特殊字符有 * ^ : | . \ 1.单个符号作为分隔符  特殊符号* .split("\\*"); 特殊符号^ .s ...

最新文章

  1. think in java interview-高级开发人员面试宝典(二)
  2. 作者:胡清华(1976-),男,博士,天津大学计算机科学与技术学院教授。
  3. mysql buffer 命中率_从MySQL的源码剖析Innodb buffer的命中率计算
  4. 如何理解5G空口(NR)?
  5. POJ1604 UVA568 UVALive5499 Just the Facts【模除+打表】
  6. kettle org.pentaho.ui.xul.XulException: java.lang.reflect.InvocationTargetException
  7. 美颜SDK的出现给直播和短视频平台带来了哪些影响?
  8. 知名清理工具或成恶意软件
  9. 是计算机系男神女神用英语怎么说,生日快乐我的男神英文怎么写
  10. 4种最常用的诡辩方法
  11. Excel实用技巧-如何批量提取excel工作表名称
  12. 盒子模型--标准盒模型和怪异盒模型
  13. 计算机专业 中职学校顶岗实习学校总结,中职学校顶岗实习论文(2)
  14. 日立、李锦记亮相云学堂广州峰会 纵论企业人才培养核心要素
  15. 5G消息是什么?RCS又是什么?让我们一探究竟
  16. hdu 4544 优先队列+贪心
  17. Python-音乐播放器APP制作
  18. Java Http 请求方式汇总
  19. 密集恐惧症候群测试图
  20. 有限体积法(11)——交错网格

热门文章

  1. 常用数据结构及其应用场景
  2. 浏览器f12监听element的值和变量的变化
  3. HTML5之HTML+CSS3代码(一)
  4. Bootstrap 下拉菜单(Dropdown)插件
  5. vue配置多页面应用~
  6. TextAnalysisTool.net -- 提高文本分析效率的小工具
  7. linux挂载硬盘下载电影,Windows上通过迅雷基于Samba往Pi3B上mount的移动硬盘下载电影...
  8. Ubuntu下安装JDK/JRE受难记!
  9. Wiremock的使用
  10. MySQL 5.7 基于 GTID 的主从复制实践