Buffer的数据存取
缓冲区 存放要读取的数据
缓冲区 和 通道 配合使用
一个用于特定基本数据类行的容器。有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类。
Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道读入到缓冲区,从缓冲区写入通道中的。
Buffer就像一个数组,可以保存多个相同类型的数据。根据类型不同(boolean除外),有以下Buffer常用子类:(没有boolean的哈)
ByteBuffer (用的最多 )
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
Buffer的概述
参数:
1)容量(capacity):表示Buffer最大数据容量,缓冲区容量不能为负,并且建立后不能修改。一旦声明 不能改变
2)限制(limit):第一个不应该读取或者写入的数据的索引,即位于limit后的数据不可以读写。缓冲区的限制不能为负,并且不能大于其容量(capacity)。 缓冲区可用大小
3)位置(position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制(limit)。 缓冲区正在操作的位置 默认从0开始
4)标记(mark)与重置(reset):标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。
方法:
put( ) 往buffer存放数据
get () 获取数据
看源码中的四个核心参数:

@Test
public void Test01() {
//初始化 byteBuffer的大小
ByteBuffer byteBuffer = ByteBuffer.allocate(10323);
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("buffer中存放数据");
byteBuffer.put("add".getBytes());
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity()); }

limit 表示 现在limit 里面
@Test
public void Test01() {
//初始化 byteBuffer的大小
ByteBuffer byteBuffer = ByteBuffer.allocate(10323);
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("buffer中存放数据");
byteBuffer.put("add".getBytes());
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
//开启读取模式 讲position设为0 不开启就从当前 position位置开始读取,会报错
byteBuffer.flip();
byte[] bytes = new byte[byteBuffer.limit()];
byteBuffer.get(bytes);
System.out.println(new String(bytes,0,bytes.length));
}
解决重复读取:
@Test
public void Test01() {
//初始化 byteBuffer的大小
ByteBuffer byteBuffer = ByteBuffer.allocate(10323);
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("buffer中存放数据");
byteBuffer.put("add".getBytes());
//开启读取模式 讲position设为0 不开启就从当前 position位置开始读取,会报错 。 读取完毕时候 position会还原
System.out.println("开启读取。。。。");
byteBuffer.flip();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes = new byte[byteBuffer.limit()];
byteBuffer.get(bytes);
System.out.println(new String(bytes,0,bytes.length));
System.out.println("重复读取");
byteBuffer.rewind();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes1 = new byte[byteBuffer.limit()];
byteBuffer.get(bytes1);
System.out.println(new String(bytes1,0,bytes1.length)); }
清空:
@Test
public void Test01() {
//初始化 byteBuffer的大小
ByteBuffer byteBuffer = ByteBuffer.allocate(10323);
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("buffer中存放数据");
byteBuffer.put("add".getBytes());
//开启读取模式 讲position设为0 不开启就从当前 position位置开始读取,会报错 。 读取完毕时候 position会还原
System.out.println("开启读取。。。。");
byteBuffer.flip();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes = new byte[byteBuffer.limit()];
byteBuffer.get(bytes);
System.out.println(new String(bytes,0,bytes.length));
System.out.println("重复读取");
byteBuffer.rewind();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes1 = new byte[byteBuffer.limit()];
byteBuffer.get(bytes1);
System.out.println(new String(bytes1,0,bytes1.length));
System.out.println("清空缓存区");
byteBuffer.clear();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes11 = new byte[byteBuffer.limit()];
byteBuffer.get(bytes11);
System.out.println(new String(bytes11,0,bytes11.length)); }
清空缓冲区,名义上其实是把 下标修改了 但是值还是存在的 数值遗忘
看看最终版本:
@Test
public void Test01() {
//初始化 byteBuffer的大小
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("buffer中存放数据");
byteBuffer.put("addNew".getBytes());
//开启读取模式 讲position设为0 不开启就从当前 position位置开始读取,会报错 。 读取完毕时候 position会还原
System.out.println("开启读取。。。。");
byteBuffer.flip();
System.out.println("读取buffer值");
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
byte[] bytes = new byte[byteBuffer.limit()];
byteBuffer.get(bytes);
System.out.println(new String(bytes,0,bytes.length));
System.out.println("重复读取");
byteBuffer.rewind();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes1 = new byte[byteBuffer.limit()];
byteBuffer.get(bytes1);
System.out.println(new String(bytes1,0,bytes1.length));
System.out.println("清空缓存区");
byteBuffer.clear();
System.out.println(byteBuffer.position()); //默认0
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("读取buffer值");
byte[] bytes11 = new byte[byteBuffer.limit()];
byteBuffer.get(bytes11);
System.out.println(new String(bytes11,0,bytes11.length)); }

上述缓冲区管理的方式几乎
* 通过allocate()获取缓冲区
* 二、缓冲区核心的方法 put 存入数据到缓冲区 get <br>获取缓冲区数据 flip 开启读模式
* 三、缓冲区四个核心属性
* capacity:缓冲区最大容量,一旦声明不能改变。 limit:界面(缓冲区可以操作的数据大小) limit后面的数据不能读写。
* position:缓冲区正在操作的位置
1)容量(capacity):表示Buffer最大数据容量,缓冲区容量不能为负,并且建立后不能修改。
2)限制(limit):第一个不应该读取或者写入的数据的索引,即位于limit后的数据不可以读写。缓冲区的限制不能为负,并且不能大于其容量(capacity)。
3)位置(position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制(limit)。
4)标记(mark)与重置(reset):标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。
Buffer的数据存取的更多相关文章
- Java-NIO(二):缓冲区(Buffer)的数据存取
缓冲区(Buffer): 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通 ...
- NIO之缓冲区(Buffer)的数据存取
缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...
- Java NIO -- 缓冲区(Buffer)的数据存取
缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...
- 缓冲区(Buffer)的数据存取
缓冲区(Buffer) 1. 缓冲区(Buffer):一个用于特定基本数据类 型的容器. 由 java.nio 包定义的,所有缓冲区 都是 Buffer 抽象类的子类.2. Java NIO 中的 B ...
- JavaScript数据存取的性能问题
JavaScript中四种基本的数据存取位置: 字面量:只代表自身 字符串.数字.布尔值.对象.函数.数组.正则,以及null和undefined 快 本地变量:var定义的 快 数组元素 ...
- Hyperledger中数据存取的实现
简介 本文介绍了在Hyperledger中数据存取的实现. API接口 Hyperledger提供基于key/value的数据存储,其中key是字符串,value则是二进制字节数组,Hyperledg ...
- 高性能JS笔记2——数据存取
数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...
- Laxcus大数据管理系统2.0(5)- 第三章 数据存取
第三章 数据存取 当前的很多大数据处理工作,一次计算产生几十个GB.或者几十个TB的数据已是正常现象,驱动数百.数千.甚至上万个计算机节点并行运行也已经不足为奇.但是在数据处理的后面,对于这种在网络间 ...
- 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)
使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...
随机推荐
- windows搭建json-server快速方法
JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源. 一.下载并安装node.js 安装完后输入 node --vers ...
- Linux下的定时任务Crontab
通过crontab -e写入定时任务的指令,一行为一项任务. 任务模式是时间克龙表达式+命令形式. 如: 2 0,6,12,18 * * * perl /root/restarttomcat.pl p ...
- C#面试:抽象类与接口
本人近日面试遇到此等问题.然后又一次补习了一下下.希望对同行们有所帮助. 一.抽象类: 抽象类是特殊的类,仅仅是不能被实例化:除此以外.具有类的其它特性:重要的是抽象类能够包括抽象方法,这 ...
- FiddlerScript学习一:改动Request或Response
前两天因项目须要,简单看了一下FiddlerScript,功能挺强的.今天有时间细致看一下,做个笔记. 改动Request或Response 改动Request和Response要在FiddlerSc ...
- Free Code Camp社区对数百计编程学习者进行的统计希望告诉你什么?
文章来源:https://www.sdk.cn/news/5044 著名编程学习社区Free Code Camp对超过1.5万名编程学习者进行了调查.其中有一个问题为:“你对哪个编程职位最感兴趣?”有 ...
- PS中混合模式是什么意思?
PS中图层混合模式中的溶解,变暗,正片叠底,颜色加深,线性加深,叠加,柔光,亮光,强光,线性光,点光,实色混合,差值,排除,色相,饱和度,颜色,亮度各是什么原理? Normal 正常模式,也是 ...
- 面试宝典之预处理、const与sizeof
#include <stdio.h> #define SUB(x, y) x - y #define ACCESS_BEFORE(element, offset, value) *SUB( ...
- js高度line-height及宽度text-align:center居中插件
1.高度居中---在高度设为100%,无法直接使用line-height:100%;会不起效果 这是用于应对height:100%的插件 /** * 高度居中函数,用于应对高度设为100%时的居中 * ...
- eclipse不能添加tomcat
有时候原来能新建server,删掉后就不能新建了 1.退出eclipse 2.到[工程目录下 workspace ]/.metadata/.plugins/org.eclipse.core.runti ...
- 过滤XSS的HTMLPurifier使用
什么是HTMLPurifier? 在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了. HTML Purifier是基于php ...