java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别
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位置就会结束。
示例代码
import java.nio.ByteBuffer;
public class ByteBufferTest {
public static void main(String[] args) {
//分配10字节大小内存空间
ByteBuffer buffer = ByteBuffer.allocate(10);
//输出初始化后position的值
System.out.println("初始化position : " + buffer.position());
//输出初始化收limit的值
System.out.println("初始化limit : " + buffer.limit());
//输出初始化后capacity的值
System.out.println("初始化capacity : " + buffer.capacity());
//输出初始化后ByteBuffer内容
printBuffer(buffer);
//调用rewind()之前指针指向下标9即位置10,已经是最大容量
//调用rewind()之后将指针移动到下标0即位置1
buffer.rewind();
System.out.println("position:" + buffer.position() + ",limit:" + buffer.limit() + ",capacity:" + buffer.capacity());
//执行写入操作,指针会自动移动
buffer.putChar('a');
//输出指针position,指针指向下标2即位置3
System.out.println("写入字符'a'后,position位置为:" + buffer.position());
buffer.putChar('啊');
//输出指针position,指针指向下标4即位置5
System.out.println("写入字符'啊'后,position位置为:" + buffer.position());
//将当前位置设置为EOF,指针移动到下标0即位置1
buffer.flip();
System.out.println("position:" + buffer.position() + ",limit:" + buffer.limit() + ",capacity:" + buffer.capacity());
//上一行代码相当于下面两句
//buffer.limit(4);
//buffer.position(0);
//输出ByteBuffer内容,即0 61 55 4a
printBuffer(buffer);
//将指针移动到下标1即位置2
buffer.position(1);
//进行compact压缩操作,compact操作会将EOF位置重置为最大容量10
//注意:该压缩操作是将下标1即位置2到位置4的值移动到位置1到位置3,位置4上的值4a不变
buffer.compact();
//输出ByteBuffer内容,即61 55 4a 4a 0 0 0 0 0 0(注意:未覆盖到的位置4的值4a不变)
printBuffer(buffer);
//注意:执行压缩compact操作后指针指向下标3即位置4,继续写入数据时会覆盖数据
System.out.println(buffer.position());
}
/**
* 输出ByteBuffer内容
* @param buffer
*/
public static void printBuffer(ByteBuffer buffer){
//记录当前位置
int position = buffer.position();
//指针移动到0
buffer.position(0);
//循环输出每个字节内容
for(int i = 0;i < buffer.limit();i++){
//读取操作,指针会自动移动
byte b = buffer.get();
System.out.print(Integer.toHexString(b));
}
//指针再移动到标记位置
buffer.position(position);
System.out.println();
}
}
输出结果
初始化position : 0
初始化limit : 10
初始化capacity : 10
0000000000
position:0,limit:10,capacity:10
写入字符'a'后,position位置为:2
写入字符'啊'后,position位置为:4
position:0,limit:4,capacity:10
061554a
61554a4a000000
3
java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别的更多相关文章
- java.nio.Buffer 中的 flip()方法
在Java NIO编程中,对缓冲区操作常常需要使用 java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- java.nio.ByteBuffer中flip,rewind,clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- 读取 java.nio.ByteBuffer 中的字符串(String) 写入方式flash.utils.ByteArray.writeUTF
通过研究ByteArray的写入格式以及方法说明,可以发现writeUTF是先使用2位写入字符串的长度,然后在其后写入字符串编码. flash.utils.ByteArray.writeUTF(val ...
- Java NIO ByteBuffer 的使用与源码研究
一.结论 ByteBuffer 是Java NIO体系中的基础类,所有与Channel进行数据交互操作的都是以ByteBuffer作为数据的载体(即缓冲区).ByteBuffer的底层是byte数组, ...
- NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- java.nio.ByteBuffer 以及flip,clear及rewind区别
Buffer 类 定义了一个可以线性存放primitive type数据的容器接口.Buffer主要包含了与类型(byte, char…)无关的功能. 值得注意的是Buffer及其子类都不是线程安全的 ...
- Java NIO Buffer中各种状态属性的含义
关于NIO Buffer中的3个重要状态属性的含义: postion, limit与capacity. public class NioTest { public static void main(S ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
随机推荐
- JS基础-该如何理解原型、原型链?
JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...
- odoo t标签用法
在odoo中,通过QWeb来对模板进行渲染后加载到浏览器中,而模板中有许多的标签来定制各种需求变化,在这里记录学习过程中碰到的标签定义,以方便查询. 模板中的标签统一都是以"t-" ...
- C/C++ 修改系统时间,导致sem_timedwait 一直阻塞的问题解决和分析
修改系统时间,导致sem_timedwait 一直阻塞的问题解决和分析 介绍 最近修复项目问题时,发现当系统时间往前修改后,会导致sem_timedwait函数一直阻塞.通过搜索了发现int sem_ ...
- HDU 6059
题意略. 思路:我们要想令 A[i] ^ A[j] < A[j] ^ A[k](i < j < k),由于A[i]和A[k]都要 ^ A[j],所以我们只需研究一下i,k这两个数之间 ...
- Java多线程之线程的暂停
Java多线程之线程的暂停 下面该稍微休息一下了呢……不过,这里说的是线程休息,不是我们哦.本节将介绍一下让线程暂停运行的方法. 线程Thread 类中的sleep 方法能够暂停线程运行,Sleep ...
- Java生成二维码(Java程序都可以使用)
工具类,链接:https://pan.baidu.com/s/18U399fTH5wBJPnL97pAekg 提取码:bmw7 注:里面的corejar包是使用的zxing的代码,我只是将其导出的ja ...
- 转载-lambda sort
原文:https://blog.csdn.net/qq_27127145/article/details/83930498 版权声明:本文为博主原创文章,转载请附上博文链接! import com.g ...
- 图解Nginx限流配置
本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...
- codeforces 879 D. Teams Formation(思维)
题目链接:http://codeforces.com/contest/879/problem/D 题意:这题题意我反正是看了很久,可能是我的理解能力有点差,就是将一个数组倍增m倍然后将连续的相同的k个 ...
- 【Offer】[37] 【序列化二叉树】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得 ...