缓冲区 存放要读取的数据

缓冲区 和 通道 配合使用

一个用于特定基本数据类行的容器。有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的数据存取的更多相关文章

  1. Java-NIO(二):缓冲区(Buffer)的数据存取

    缓冲区(Buffer): 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通 ...

  2. NIO之缓冲区(Buffer)的数据存取

    缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...

  3. Java NIO -- 缓冲区(Buffer)的数据存取

    缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...

  4. 缓冲区(Buffer)的数据存取

    缓冲区(Buffer) 1. 缓冲区(Buffer):一个用于特定基本数据类 型的容器. 由 java.nio 包定义的,所有缓冲区 都是 Buffer 抽象类的子类.2. Java NIO 中的 B ...

  5. JavaScript数据存取的性能问题

    JavaScript中四种基本的数据存取位置: 字面量:只代表自身 字符串.数字.布尔值.对象.函数.数组.正则,以及null和undefined    快 本地变量:var定义的    快 数组元素 ...

  6. Hyperledger中数据存取的实现

    简介 本文介绍了在Hyperledger中数据存取的实现. API接口 Hyperledger提供基于key/value的数据存储,其中key是字符串,value则是二进制字节数组,Hyperledg ...

  7. 高性能JS笔记2——数据存取

    数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...

  8. Laxcus大数据管理系统2.0(5)- 第三章 数据存取

    第三章 数据存取 当前的很多大数据处理工作,一次计算产生几十个GB.或者几十个TB的数据已是正常现象,驱动数百.数千.甚至上万个计算机节点并行运行也已经不足为奇.但是在数据处理的后面,对于这种在网络间 ...

  9. 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)

    使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...

随机推荐

  1. [java面试]关于多态性的理解

    执行时多态性是面向对象程序设计代码重用的一个最强大机制.Java多态性的概念也能够被说成"一个接口.多个方法".Java实现执行时多态性的基础是动态方法调度,它是一种在执行时而不是 ...

  2. 浅谈PHP与手机APP开发即API接口开发

    API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞生很多专门API服务的公司,如:聚合数据(http ...

  3. PhoneNumber

    项目地址:PhoneNumber 简介:一个获取号码归属地和其他信息(诈骗.骚扰等)的开源库   一个获取号码归属地和其他信息(诈骗.骚扰等)的开源库.支持本地离线(含归属地.骚扰.常用号码)和网络( ...

  4. 代理server的概要知识

    技术支持请留言:http://www.lcpower.cn 一.什么是代理server? 代理server英文全称是Proxy Server.其功能就是代理网络用户去取得网络信息.形象的说:它是网络信 ...

  5. Python 2.7 升 3.4

    Ubuntu 14.04 已经安装有python3.4.0 命令行使用python3 或者创建链接即可 ln -s /usr/bin/python3 /usr/bin/python [推荐此方法,然后 ...

  6. Oracle TNS路径

    修改tnsnames.oRA,监听文件   Oracle TNS路径 G:\Oracle\product\11.2.0\client_1\network\admin\tnsnames.oRA

  7. Msfvenom 学习笔记与总结

    平台:Android,可用Payload: android/meterpreter/reverse_http Run a meterpreter server on Android. Tunnel c ...

  8. HTML元素定位

    一切皆为框 div.h1 或 p 元素常常被称为块级元素(block element).这意味着这些元素显示为一块内容,即"块框".与之相反,span 和 strong 等元素称为 ...

  9. oracle 误删数据的回复操作

    update operator t set t.username = (select username from operator  AS OF TIMESTAMP TO_TIMESTAMP('201 ...

  10. HDFS源码分析EditLog之读取操作符

    在<HDFS源码分析EditLog之获取编辑日志输入流>一文中,我们详细了解了如何获取编辑日志输入流EditLogInputStream.在我们得到编辑日志输入流后,是不是就该从输入流中获 ...