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)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...
随机推荐
- 2017.3.27 集成modeler后的一些主要路径(持续更新)
1.设计器访问路径 项目名:wfs_web edtor-app和modeler.html的存放位置:webapp/designer/editor-app app-cfg.js中根路径设置:'conte ...
- IntelliJ IDEA 识别一个类所属的jar包package
IntelliJ IDEA 识别一个类所属的jar包package 按住ctrl,鼠标移动上去,不要点击: 有木有快捷键? ctrl+alt+B直接就过去了:需要再跳回来:
- Nginx配置文档具体解释
Nginx的配置文档具体解释.在这儿做个总结,以便以后使用的时间查看. 下面大部分自己整理.部分来自參考 #设置用户 #user nobody; #启动进程数(一般和server的CPU同样) #能 ...
- intent传值传对象跳转
intent传值传对象跳转 1.传值 //原activity中存入一个字段 intent = new Intent(From.this, To.class); intent.putExtra(&quo ...
- 关于郭天祥51开发板无法烧敲代码问题的解决(Prolific USB-to-Serial Comm Port)
1. 事件背景: 因为使用了win8系统,之前购买的郭天祥C51开发板在通过一个两头都是usb口的下载线下载程序时出现了问题:下载工具stc isp无法连接到开发板上的串口,所以无法下载程序到c51开 ...
- Session对象失效的客户端解决方法
ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息.当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问 ...
- SQL之相关语法及操作符
概述:UNION.SELECT INTO.INSERT INTO SELECT.SQL约束 UNION操作符 UNION操作符用于合并两个或多个SELECT语句的结果集 请注意,UNION内部的每个S ...
- 两个栈来实现一个队列的C++代码
利用两个栈来实现一个队列, 这个问题非经常见. 最关键的是要有好的思路, 至于实现, 那是非常easy的事情了. 在本文中, 也想说说自己的思路, 可是. 我认为用代码来表述思路更符合我的习惯. 也 ...
- WINDOWS下的squid
今天写这篇教程目的在于分享自己在WINDOWS主机下配置squid的方法.哪些地方写的不完善或是不完整或是需要修改的地方,大家可以提出.我会第一时间纠正.下面看正文部分.先提条件,您预安装配置squi ...
- FTP 连接报错
Filezilla 站点管理器=>选中FTP站点=>加密(只使用普通FTP)