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数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
随机推荐
- SpingBoot:整合Elasticsearch7.2.0
Spring boot 2.1.X整合Elasticsearch最新版的一处问题 新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支持 ...
- 关于原生js中函数的三种角色和jQuery源码解析
原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...
- HTML 画布(摘自菜鸟教程)
颜色.样式和阴影 属性 描述 fillStyle 设置或返回用于填充绘画的颜色.渐变或模式. strokeStyle 设置或返回用于笔触的颜色.渐变或模式. shadowColor 设置或返回用于阴影 ...
- APPARENT DEADLOCK!!!c3p0数据库连接池死锁问题
项目进行压力测试的时候,运行大概1小时候,后台抛出以下异常: Nov 9, 2012 1:41:59 AM com.mchange.v2.async.ThreadPoolAsynchronousRun ...
- 洛谷 P1262 【间谍网络】
题库 : 洛谷 题号 : 1262 题目 : 间谍网络 link : https://www.luogu.org/problemnew/show/P1262 思路 : 这题可以用缩点的思想来做.先用T ...
- CodeForces 1107 - G Vasya and Maximum Profit 线段树
题目传送门 题解: 枚举 r 的位置. 线段树每个叶子节点存的是对应的位置到当前位置的价值. 每次往右边移动一个r的话,那么改变的信息有2个信息: 1. sum(a-ci) 2.gap(l, r) 对 ...
- poj 2352 & Ural 1028 数星星 题解
一道水题,由于x坐标递增y坐标也递增于是前缀和统计即可,用树状数组实现. #include<bits/stdc++.h> using namespace std; const int ma ...
- 第 14 篇:交流的桥梁“评论功能”——HelloDjango 系列教程
截止到目前为止我们的 django blog 文章展示部分,已经实现的"八九不离十"了.你以为本系列文章就要结束了吗?不能够!新的征程才刚刚开始,HelloDjango 系列文章刚 ...
- ets查询接口match、select说明
ets:match/2用法:match(Tab, Pattern) -> [Match]返回和模式Pattern匹配的对象.一个匹配模式可能包含:绑定部分.'_'匹配任何Erlang项和匹配变量 ...
- C#基础——事件初步
事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件.在这里将以较简单的方式呈现事件最基本的用法. 1.事件的定义 给事件下定义是一个较困难的事,因为它体现的是对象与对 ...