缓冲区 存放要读取的数据

缓冲区 和 通道 配合使用

一个用于特定基本数据类行的容器。有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. 2016.6.20 eclipse中maven的配置

    前期准备: 安装maven,配置maven的环境变量,并且通过mvn -v验证安装成功.   网上的教程说,需要在线或者离线安装maven integration for eclipse插件. 但是我 ...

  2. 上传项目至svn服务器,从svn上获取项目

    1.在桌面右键->TortoiseSVn->Repo_brower->输入地址,进入 ,ok 2.在地址目录上右键==>>add folder==>>选择你要 ...

  3. Andfix热修复框架原理及源代码解析-上篇

    热补丁介绍及Andfix的使用 Andfix热修复框架原理及源代码解析-上篇 Andfix热修复框架原理及源代码解析-下篇 1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用 ...

  4. nginx如何设置防盗链

    关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链! 一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通 ...

  5. Oracle创建自增字段和修改方法-ORACLE SEQUENCE的简单介绍

    http://blog.csdn.net/zhoufoxcn/article/details/1762351先假设有这么一个表: create table S_Depart  (    DepartI ...

  6. FZU2125:简单的等式

    Problem Description 如今有一个等式例如以下:x^2+s(x,m)x-n=0. 当中s(x,m)表示把x写成m进制时,每一个位数相加的和.如今,在给定n,m的情况下,求出满足等式的最 ...

  7. S:33184777

    https://github.com/wjlWork/Crawl/tree/da0b63bc43bd7c238963f834a11df2581cecfb9c https://github.com/wh ...

  8. jquery插件获取事件类型

    //需要在使用函数时传入event关键字 $('[name=lprice]').change(function(event){ $('[name=lprice]').validate({ event: ...

  9. c# emit 实现类的代理

    using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; namespace Em ...

  10. 移动应用开发测试工具Bugtags集成和使用教程【转载】

    前段时间,有很多APP突然走红,最终却都是樱花一现.作为一个创业团队,突然爆红是非常难得的机会.然并卵,由于没有经过充分的测试,再加上用户的激增,APP闪退.服务器数据异常等问题就被暴露出来,用户的流 ...