1、介绍

Buffer是nio包的一个抽象类,作为java nio的三大组件(Buffer、Channel,Selector)之一,在java nio网络编程中尤为重要。

Buffer提供了一个字节缓冲区,配合Channel使用,可以从Channel中读取或写入数据。

2、结构

属性介绍

以ByteBuffer为例,其包括5个主要的属性:hb、position、limit、capacity、mark。

hb:ByteBuffer类有一个byte数组变量hb,此数组里面存放的就是实际的字节数据。

capacity:容量大小,其实就是hb字节数组的大小,始终不变。

position:当前读写操作的ByteBuffer对象位置,其实就是hb字节数组下标位置。

limit:读写操作position的大小限制,读写操作时position需要小于limit

mark:记录当前读写的位置,方便后续使用。

常用API方法

/*** 初始化指定大小的ByteBuffer对象返回。*/
static ByteBuffer allocate(int capacity);
/*** 使用指定字节数组初始化ByteBuffer对象返回。*/
static ByteBuffer wrap(byte[] array)
/*** 返回当前position位置的字节数据,position自增1。*/
byte get();
/*** 返回指定位置的数据。*/
byte get(int index);
/*** 当前position位置设置为传入字节,position自增1。*/
ByteBuffer put(byte b);
/*** 切换到读模式。*/
Buffer flip();
/*** 切换到写模式,不保留未读完数据。*/
Buffer clear();
/*** 切换到写模式,保留未读完数据。*/
ByteBuffer compact();

图解

  • ①初始化状态。执行**ByteBuffer.allocate(10);**后状态。

  • ②调用put方法插入数据,每往当前position位置插入一个数据,position执行加1操作。插入4个数据后状态。

  • ③调用flip方法,依次设置limit=position、position=0、mark=-1。

  • ④调用get方法读取数据,返回当前position下标对应的值,然后positon执行加1操作。读取三个数据后状态。

  • ⑤调用clearcompact方法,重置position、limit的值。

调用clear后状态(依次执行position = 0、limit = capacity、mark = -1)。

调用compact后状态。

3、读模式和写模式

其实ByteBuffer本身并没有读模式、写模式的概念,为了便于初学者理解网友们强加的概念。

flip、clear、compact等方法只是修改了position、limit、mark等属性的值而已,理解了上面的几个操作图就不需要理解不存在的读模式、写模式,避免混淆理解。

4、使用演示

  • 演示1
/*** 代码*/
public class ByteBufferDemo {public static void main(String[] args) {ByteBuffer buffer = ByteBuffer.allocate(10);buffer.put((byte)'a');buffer.put((byte)'b');buffer.put((byte)'c');buffer.put((byte)'d');System.out.println(buffer);buffer.flip();System.out.println(buffer);System.out.println(buffer.get());System.out.println(buffer.get());System.out.println(buffer.get());buffer.clear();System.out.println(buffer);System.out.println(Arrays.toString(buffer.array()));System.out.println(buffer.get(2));}
}/*** 运行结果*/
java.nio.HeapByteBuffer[pos=4 lim=10 cap=10]
java.nio.HeapByteBuffer[pos=0 lim=4 cap=10]
97
98
99
java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]
[97, 98, 99, 100, 0, 0, 0, 0, 0, 0]
99
  • 演示二
/*** 代码*/
public class ByteBufferDemo {public static void main(String[] args) {ByteBuffer buffer = ByteBuffer.allocate(10);buffer.put((byte)'a');buffer.put((byte)'b');buffer.put((byte)'c');buffer.put((byte)'d');System.out.println(buffer);buffer.flip();System.out.println(buffer);System.out.println(buffer.get());System.out.println(buffer.get());System.out.println(buffer.get());buffer.compact();System.out.println(buffer);System.out.println(Arrays.toString(buffer.array()));System.out.println(buffer.get(2));}
}/*** 运行结果*/
java.nio.HeapByteBuffer[pos=4 lim=10 cap=10]
java.nio.HeapByteBuffer[pos=0 lim=4 cap=10]
97
98
99
java.nio.HeapByteBuffer[pos=1 lim=10 cap=10]
[100, 98, 99, 100, 0, 0, 0, 0, 0, 0]
99
  • 演示三
/*** 代码*/
public class ByteBufferDemo {public static void main(String[] args) {byte[] bytes = {(byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g'};ByteBuffer buffer = ByteBuffer.wrap(bytes);System.out.println(buffer);System.out.println(Arrays.toString(buffer.array()));//直接读取数据System.out.println(buffer.get());System.out.println(buffer);//写入数据buffer.put((byte)0x01);buffer.put((byte)0x02);System.out.println(buffer);System.out.println(Arrays.toString(buffer.array()));}
}/*** 运行结果*/
java.nio.HeapByteBuffer[pos=0 lim=7 cap=7]
[97, 98, 99, 100, 101, 102, 103]
97
java.nio.HeapByteBuffer[pos=1 lim=7 cap=7]
java.nio.HeapByteBuffer[pos=3 lim=7 cap=7]
[97, 1, 2, 100, 101, 102, 103]

java nio ByteBuffer的使用相关推荐

  1. java.nio.ByteBuffer用法小结

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

  2. hbase 2.4 java.lang.NoSuchMethodError: java.nio.ByteBuffer.rewind()Ljava/nio/ByteBuffer

    hbase 2.4集群环境启动报错,java.lang.NoSuchMethodError: java.nio.ByteBuffer.rewind()Ljava/nio/ByteBuffer ​ 详细 ...

  3. java byte 释放内存_java java.nio.ByteBuffer.allocateDirect 导致内存泄露

    java能够经过java.nio.ByteBuffer.allocateDirect(capacity)直接运用non java heap(java堆外)的内存 . 一.运用意图: 1.拓荒数据缓冲区 ...

  4. java.nio.ByteBuffer常用方法详解

    一.前言 在Java nio中,主要有三大组件:Buffer,Channel和Selector.这三者之间的关系可以按照如下方式进行理解: Buffer提供了一个字节缓冲区,其可以不断的从Channe ...

  5. java.nio.ByteBuffer中flip、rewind、clear方法的区别

    对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...

  6. [转] java.nio.ByteBuffer中flip、rewind、clear方法的区别

    转载 对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限 ...

  7. Java NIO 之 ByteBuffer()

    2019独角兽企业重金招聘Python工程师标准>>> 名词解释 capacity : 容量,表示缓冲区中最大存储数据的容量.一旦声明不能改变. limit : 界限,表示缓冲区中可 ...

  8. java bytebuffer 读写_java nio bytebuffer文件读写问题

    为什么下面的代码从文件中读不出3和2来?importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOExc ...

  9. java nio rewind_java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别

    java.nio.ByteBuffer 1. ByteBuffer中的参数position.limit.capacity.mark含义: position:表示当前指针的位置(下一个要操作的数据元素的 ...

  10. java NIO详解

    http://zalezone.cn/2014/09/17/NIO%E7%B2%BE%E7%B2%B9/ 1. 前言 我们在写java程序的时候,为了进行优化,把全部的精力用在了处理效率上,但是对IO ...

最新文章

  1. python代码壁纸-Python爬取高清壁纸
  2. python三层装饰器-python3装饰器
  3. K.O. -------- Eclipse中Maven的报错处理
  4. 新一代音视频技术架构驱动未来多媒体创新
  5. UML工具:EA(Enterprise Architect)
  6. 步进电机无细分和20细分_细分网站导航会话
  7. 计算机公共基础知识论文,计算机等级考试二级公共基础知识汇总.doc
  8. 【算法分析与设计】快速幂算法与快速幂取模算法
  9. 综合演练 实现登陆功能 1124
  10. php70w-mysql_Centos Apache+PHP5.6/PHP7.0+mysql5.5
  11. pandas.DataFrame对根据某些列对某些列进行修改
  12. POJ2492A Bug's Life【并查集+根节点偏移】
  13. 参加美赛能给计算机保研er带来些什么?
  14. 干货 | 携程风控数据仓库实践
  15. 凌晨四点钟深圳的风景
  16. java基础2 判断语句:if ... else 语句和 switch 语句
  17. 桌面上打开计算机有延迟感觉,电脑中右击操作反应慢如何解决|解决右键菜单弹出延迟的方法...
  18. java向手机号发送短信验证码
  19. 路径上有/**/、/*/的含义
  20. 微软员工揭秘 Linux 子系统研发全过程

热门文章

  1. XJOI 9864 金字塔
  2. GoAhead学习之GoForms
  3. mybatis数据库字段增加
  4. asm磁盘头全部损坏数据0丢失恢复----惜分飞
  5. xshell绿色版下载-连接远程服务器-unzip使用
  6. 人脸检测实战终极:使用 OpenCV 和 Python 进行人脸对齐
  7. danfoss 变频器的profinet通讯调试_西门子G120变频器S7-300之间的PN通讯
  8. ubuntu修改配置IP地址和DNS的方法总结(4种)
  9. linux打开dwg文件怎么打开方式,dwg文件扩展名,dwg文件怎么打开?
  10. 电吉他效果器音频处理(1)——失真效果器、超载失真效果器、移相效果器、弗兰格效果器