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()等方法的使用和区别的更多相关文章

  1. java.nio.Buffer 中的 flip()方法

    在Java NIO编程中,对缓冲区操作常常需要使用  java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...

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

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

  3. java.nio.ByteBuffer中flip,rewind,clear方法的区别

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

  4. 读取 java.nio.ByteBuffer 中的字符串(String) 写入方式flash.utils.ByteArray.writeUTF

    通过研究ByteArray的写入格式以及方法说明,可以发现writeUTF是先使用2位写入字符串的长度,然后在其后写入字符串编码. flash.utils.ByteArray.writeUTF(val ...

  5. Java NIO ByteBuffer 的使用与源码研究

    一.结论 ByteBuffer 是Java NIO体系中的基础类,所有与Channel进行数据交互操作的都是以ByteBuffer作为数据的载体(即缓冲区).ByteBuffer的底层是byte数组, ...

  6. NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

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

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

  8. Java NIO Buffer中各种状态属性的含义

    关于NIO Buffer中的3个重要状态属性的含义: postion, limit与capacity. public class NioTest { public static void main(S ...

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

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

随机推荐

  1. Linux运维记 - 重启网卡后,网络不通

    前言 不小心重启了线上服务器的网卡,结果整个网络不通了,就算使用127.0.0.1访问都不行,第一次遇到这种问题,当时就六神无主了,两个人排查了好久也没找到原因,万分火急.排查内核日志发现网卡状态不断 ...

  2. 渗透之路基础 -- SQL注入

    目录 mysql注入(上) limit 有两个参数 limit 2,3 表示从2开始查3条 通过MySql内置数据库获取表名 通过MySql内置数据库获取表名对应的列名 mysql注入(中) SQL常 ...

  3. VMware网络设置的三种方式

    VMWare提供了三种工作模式:host-only(主机模式).NAT(网络地址转换模式).bridged(桥接模式) 1.host-only(主机模式) 在某些特殊的网络调试环境中,如何要求将真实环 ...

  4. [系列] go-gin-api 规划目录和参数验证(二)

    目录 概述 规划目录结构 模型绑定和验证 自定义验证器 制定 API 返回结构 源码地址 go-gin-api 系列文章 概述 首先同步下项目概况: 上篇文章分享了,使用 go modules 初始化 ...

  5. 随笔编号-10 window环境下,命令行导入sql脚本详解

    目标:使用window命令行(DOS)导入sql脚本(适用于数据量很大的脚本). 执行步骤: 1  找到mysql bin 文件所在之目录: 2  打开dos命令行界面,win+r 组合键打开运行对话 ...

  6. 小白专场-多项式乘法与加法运算-c语言实现

    目录 一.题意理解 二.求解思路 三.多项式的表示 3.1 数组 3.2 链表 四.程序框架搭建 五.如何读入多项式 六.如何将两个多项式相加 七.如何将两个多项式相乘 八.如何将多项式输出 一.题意 ...

  7. Java中指令重排

    /** * 指令重排:代码执行顺序与预期不一致 (发生在前后行代码无联系时) * 目的:提高性能 * */ public class HappenBefore { private static int ...

  8. 在Azure云上实现postgres主备切换

    以下是工作上实现postgres主备切换功能所用到的代码和步骤,中间走了不少弯路,在此记录下.所用到的操作系统为centos 7.5,安装了两台服务器,hostname为VM7的为Master,VM8 ...

  9. 基于DP+位运算的RMQ算法

    来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n) ...

  10. codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)

    题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...