java.nio.ByteBuffer

1. ByteBuffer中的参数position、limit、capacity、mark含义:

position:表示当前指针的位置(下一个要操作的数据元素的位置)

limit:表示当前数组最大的使用量,即有效位置的EOF位置(缓冲区数组中不可操作的下一个元素的位置,limit<=capacity)

capacity:表示缓冲区最大容量(缓冲区数据的总长度)

mark:用于记录当前position的前一个位置或者默认是-1

2. ByteBuffer中常用方法含义:

reset():把position设置为mark的值,相当于之前做过一个标记,现在回退到之前标记的地方。

clear():将参数设置为position=0,limit=capacity,mark=-1,类似于初始化,但并不影响底层byte数组的内容(注意:clear只是把指针移到位置0,并没有真正清空数据)。

flip():将参数设置为limit=position,position=0,mark=-1,翻转,即将未翻转之前0到position之间的数据放置到翻转之后的position(即0)到limit之间的这块区域,翻转将缓冲区的状态由存数据变为准备取数据(注意:将当前位置设置为EOF,指针位置指向0)。

rewind():将参数设置为position=0,mark=-1,limit的值不变(注意:指针指向0)。

remaining():return limit - position,即返回limit和position之间的相对位置差。

hasRemaining():return position < limit,即返回是否还有未读内容。

compact():将position与limit之间的内容移到0与(limit - position)之间的区域,position的值变为limit - position,limit的值变为capacity;如果先将position的设置到limit,再执行compact操作,就相当于clear操作(注意:compact表示压缩数据,例如当前EOF是6,当前指针指向2即下标0、1位置的数据已经写出,此时执行compact方法就是将下标2、3、4、5的数据移动到下标0、1、2、3的位置,指针指向下标4的位置,然后从4的位置继续写入数据。写完后,把指针移动到0,再写出,然后再执行compact操作,如此反复......)。

示例:初始化一个ByteBuffer,缓冲区最大容量为10,开始指针指向下标0即position=0。

然后写入6字节数据,写入完成后下标0、1、2、3、4、5位置有实际写入的数据,下标6、7、8、9位置为默认值0。

此时,指针指向6,即position=6,limit(6)方法会将当前位置设为EOF位置。

最后,读取数据时读取到EOF位置就会结束。

示例代码

1 importjava.nio.ByteBuffer;2

3 public classByteBufferTest {4

5 public static voidmain(String[] args) {6

7 //分配10字节大小内存空间

8 ByteBuffer buffer = ByteBuffer.allocate(10);9 //输出初始化后position的值

10 System.out.println("初始化position : " +buffer.position());11 //输出初始化收limit的值

12 System.out.println("初始化limit : " +buffer.limit());13 //输出初始化后capacity的值

14 System.out.println("初始化capacity : " +buffer.capacity());15 //输出初始化后ByteBuffer内容

16 printBuffer(buffer);17

18 //调用rewind()之前指针指向下标9即位置10,已经是最大容量19 //调用rewind()之后将指针移动到下标0即位置1

20 buffer.rewind();21 System.out.println("position:" + buffer.position() + ",limit:" + buffer.limit() + ",capacity:" +buffer.capacity());22 //执行写入操作,指针会自动移动

23 buffer.putChar('a');24 //输出指针position,指针指向下标2即位置3

25 System.out.println("写入字符'a'后,position位置为:" +buffer.position());26 buffer.putChar('啊');27 //输出指针position,指针指向下标4即位置5

28 System.out.println("写入字符'啊'后,position位置为:" +buffer.position());29

30 //将当前位置设置为EOF,指针移动到下标0即位置1

31 buffer.flip();32 System.out.println("position:" + buffer.position() + ",limit:" + buffer.limit() + ",capacity:" +buffer.capacity());33 //上一行代码相当于下面两句34 //buffer.limit(4);35 //buffer.position(0);36

37 //输出ByteBuffer内容,即0 61 55 4a

38 printBuffer(buffer);39 //将指针移动到下标1即位置2

40 buffer.position(1);41 //进行compact压缩操作,compact操作会将EOF位置重置为最大容量1042 //注意:该压缩操作是将下标1即位置2到位置4的值移动到位置1到位置3,位置4上的值4a不变

43 buffer.compact();44 //输出ByteBuffer内容,即61 55 4a 4a 0 0 0 0 0 0(注意:未覆盖到的位置4的值4a不变)

45 printBuffer(buffer);46

47 //注意:执行压缩compact操作后指针指向下标3即位置4,继续写入数据时会覆盖数据

48 System.out.println(buffer.position());49 }50

51 /**

52 * 输出ByteBuffer内容53 *@parambuffer54 */

55 public static voidprintBuffer(ByteBuffer buffer){56

57 //记录当前位置

58 int position =buffer.position();59 //指针移动到0

60 buffer.position(0);61 //循环输出每个字节内容

62 for(int i = 0;i < buffer.limit();i++){63 //读取操作,指针会自动移动

64 byte b =buffer.get();65 System.out.print(Integer.toHexString(b));66 }67 //指针再移动到标记位置

68 buffer.position(position);69 System.out.println();70 }71 }

输出结果

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

0000000000position:0,limit:10,capacity:10写入字符'a'后,position位置为:2写入字符'啊'后,position位置为:4position:0,limit:4,capacity:10061554a

61554a4a0000003

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

  1. java nio rewind_java.nio.ByteBuffer 以及flip,clear及rewind区别

    Buffer 类 定义了一个可以线性存放primitive type数据的容器接口.Buffer主要包含了与类型(byte, char-)无关的功能. 值得注意的是Buffer及其子类都不是线程安全的 ...

  2. java 8位随机数_JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 1 public static String getRandom1(intlen) {2 int rs = ...

  3. java读取pdf_Java 读取PDF中的文本和图片的方法

    本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取. 使用工具:Free Spire.PDF for Java ...

  4. java 文件目录是否存在_java中判断文件目录是否存在的方法

    java中判断文件目录是否存在的方法 发布时间:2020-06-23 09:34:47 来源:亿速云 阅读:72 作者:Leah 本篇文章展示了java中判断文件目录是否存在的方法具体操作,代码简明扼 ...

  5. java 可变参数列表_java中可变参数列表的实现方法

    我们在对可变参数有一定的认识后,可以引申一下它的使用范围.在数组中也会需要参数的传入,那么结合参数的数量不固定,我们在参数类型上也得到了增加,这就是本篇所要讲的可变参数列表.下面我们就java可变参数 ...

  6. ByteBuffer中的flip()、clear()、compact()

    NIO读取文件流的简单demo: public static void main(String[] args) {try (FileChannel channel = new FileInputStr ...

  7. java curl json_curl javaSSm框架中传入json数组的格式方法

    curl与java结合传入get.post,head请求, 比如: curl的地址: curl -l 127.0.0.1:8080/spacobj/core/do?acid=100 -H " ...

  8. java try的用法_Java中try、catch的使用方法

    Java中有两种处理异常的方式,分别是用throws抛出异常.用try.catch捕获异常. try-catch 在Java try-catch语句的语法格式: try{ //代码块 }catch(E ...

  9. java web access_Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

最新文章

  1. js修改地址栏url_在gulp、create-react-app中css,js中的文件路径
  2. 帆软日期控件变灰_FineReport-JS脚本常见日期使用整理
  3. websocket 获取连接id_nodejs做后端,用websocket写聊天室,怎么获取连接用户的ip呢?...
  4. Windows10搭建ftp服务
  5. 机器学习之 weka学习(三)
  6. 余弦信号频谱表达式_信号傅里叶变换系列文章(1):傅里叶级数、傅里叶系数以及傅里叶变换...
  7. python——pandas数据分析(表格处理)工具实现Apriori算法
  8. Linux之网络管理(6)ip及路由相关命令
  9. GridBagLayout
  10. 哪些版本linux支持arm,腾讯QQ Linux版本正式回归 支持x64 ARM64 MIPS64架构
  11. 期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页
  12. 斯坦福NLP名课带学详解 | CS224n 第7讲 - 梯度消失问题与RNN变种(NLP通关指南·完结)
  13. 三极管开关电路_简析三极管开关电路设计
  14. oracle+in条件优化,Oracle语句优化30个规则详解
  15. iOS 越狱检测/反越狱
  16. 【嵌入式09】STM32串口通信,发送Hello Windows示例
  17. 高数 07.04 多元复合函数的求导法则
  18. SQL BETWEEN AND 用法
  19. win10解决设置默认打开方式不生效问题
  20. 五一劳动节,向劳动者致敬!

热门文章

  1. 文物3D展示|博物馆3D可视化 是如何实现的?
  2. 调取python背景减法库:MOG2和KNN,非常好用
  3. window.showModalDialog 简介
  4. Android EventBus使用
  5. 弱网测试工具-Network-Emulator-Toolkit
  6. Kubernetes更优雅的监控工具Prometheus Operator
  7. 软件配置管理(一)配置管理概念与目标
  8. USB总线驱动及鼠标驱动实例
  9. SpringFramework、SpringBoot、SpringCloud的区别
  10. Git LFS 入门指南