缓冲区 存放要读取的数据

缓冲区 和 通道 配合使用

一个用于特定基本数据类行的容器。有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类加static修饰编译器会说什么?

    Illegal modifier for the class XXX;only public abstract & final are permitted.

  2. 成功者的特点 VS 失败者的特点

  3. centos7 安装rocketmq(quick start)

    Quick Start This quick start guide is a detailed instruction of setting up RocketMQ messaging system ...

  4. Objective-C学习笔记(十九)——对象方法和类方法的相互调用

    事实上在OC的对象方法(减号方法)和类方法(加号方法)并非相互独立的,它们也能够发生千丝万缕的关系,今天我们来研究下它们两者相互调用的问题.该样例还是以People类为基础. (一)对象方法调用类方法 ...

  5. 时钟展频技术能有效降低EMI,深入讲解展频发生器!

    原文地址:https://baijiahao.baidu.com/s?id=1608649367453023659&wfr=spider&for=pc 相关文章: 1.http://b ...

  6. iOS 从UITableViewController中分离数据源

    之前看objc.io #1 Light View Controllers看到一个非常不错的技巧:从UITableViewController中分离数据源,这样能够减小UITableViewContro ...

  7. Android NDK开发常见错误

    错误一: make: *** No rule to make target `/cygdrive/d/1-workspace/showmap-android-opengles/jni/showmap_ ...

  8. 【7.1.1】ELK集群搭建 之 ES集群

    写在前边 昨天晚上就已经完成这篇博客了,就是在测试这块是否正常跑起来,晚上没搞完,上班前把电脑关机带着,结果没保存!基本上昨天写的东西都丢了,好在博客园的图片url还在. 为了让大家都轻松些,我轻松写 ...

  9. iframe子页面获取父页面元素的方法

    在iframe子页面获取父页面元素 代码如下: $.('#objld', parent.document); 在父页面获取iframe子页面的元素 代码如下: $("#objid" ...

  10. SVN 等版本管理工具

    程序猿团队开发代码,必须的程序版本管理工具 1.SVN使用教程总结 2.SVN如何切换用户 在使用svn更新或提交数据时需要输入用户名和密码,在输入框中可以选择是否记录,以便下次操作无需再次输入用户名 ...