JavaNIO缓冲区
package com.nio.test; import java.nio.ByteBuffer; import org.junit.Test; /**
*
* @author fliay
*
* 一、缓冲区(buffer)
* 根据数据类型不同(boolean)除外,提供了相应类型的缓冲区;
* ByteBuffer
* CharBuffer
* ShortBuffer
* IntBuffer
* LongBuffer
* FloatBuffer
* BoubleBuffer
* 上述缓冲区的管理方式几乎一致,通过allocate() 获取缓冲区
*
* 二、缓冲区存取数据的两个核心方法:
* 1.put(): 存入数据到缓冲区中
* 2.get(): 获取缓冲区中的数据
*
* 三、缓冲区中的四个核心属性:
* 1.capacity: 容量,表示缓冲区最大存储数据的容量。
* 2.limit: 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
* 3.position: 位置,表示缓冲区中正在操作数据的位置。
* 4.mark: 标记,表示记录当前position的位置,可以通过reset() 恢复到mark的位置
*
*
* 0 <= mark <= position <= limit <= capacity
*
*/ public class TestBuffer { @Test
public void test1(){ String str = "abcde";
//1.分配一个指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024); System.out.println("------------------allocate(分配指定大小的缓冲区)-------------------");
System.out.println("position(正在操作数据位置):"+buf.position());
System.out.println("limit(可以操作数据的大小):"+buf.limit());
System.out.println("capacity(最大存储数据容量):"+buf.capacity()); //2.利用put() 存入数据到缓冲区
buf.put(str.getBytes()); System.out.println("------------------put(存入数据到缓冲区)-------------------");
System.out.println("position(正在操作数据位置):"+buf.position());
System.out.println("limit(可以操作数据的大小):"+buf.limit());
System.out.println("capacity(最大存储数据容量):"+buf.capacity()); //3.切换读取数据数据模式
buf.flip(); System.out.println("------------------flip(切换读取数据模式)-------------------");
System.out.println("position(正在操作数据位置):"+buf.position());
System.out.println("limit(可以操作数据的大小):"+buf.limit());
System.out.println("capacity(最大存储数据容量):"+buf.capacity()); //4.利用get() 读取缓冲区中的数据
System.out.println("------------------get读取缓冲区中的数据-------------------");
byte[] s = new byte[buf.limit()];
buf.get(s);
System.out.println("读取缓冲区中的数据:"+new String(s,0,s.length)); System.out.println("------------------get(读取缓冲区中的数据)-------------------");
System.out.println("position(正在操作数据位置):"+buf.position());
System.out.println("limit(可以操作数据的大小):"+buf.limit());
System.out.println("capacity(最大存储数据容量):"+buf.capacity()); //5.rewind()可重复读
buf.rewind();
System.out.println("------------------rewind(重置可操作数据/可重复读)-------------------");
System.out.println("position(正在操作数据位置):"+buf.position());
System.out.println("limit(可以操作数据的大小):"+buf.limit());
System.out.println("capacity(最大存储数据容量):"+buf.capacity()); //6.clear() 清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态
buf.clear();
System.out.println("------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------");
System.out.println("position(正在操作数据位置):"+buf.position());
System.out.println("limit(可以操作数据的大小):"+buf.limit());
System.out.println("capacity(最大存储数据容量):"+buf.capacity()); } @Test
public void test2(){
String str="abcde";
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put(str.getBytes());
buf.flip();
byte[] b = new byte[buf.limit()];
buf.get(b,0,2);
System.out.println(new String(b,0,2));
System.out.println(buf.position());
//mark()标记
buf.mark();
System.out.println("------------------mark 标记后-------------------");
buf.get(b, 2, 2);
System.out.println(new String(b,2,2));
System.out.println(buf.position()); System.out.println("------------------reset 恢复到mark的位置-------------------");
//reset 恢复到mark的位置
buf.reset();
System.out.println(buf.position());
//判断缓冲区中是否还有剩余数据
if(buf.hasRemaining()){
System.out.println("------------------获取缓冲区中所有剩余数据-------------------");
System.out.println(buf.remaining()); System.out.println("缓冲区中的剩余数据:"+new String(b,buf.position(),buf.remaining()));
} } }
输出结果
------------------allocate(分配指定大小的缓冲区)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
------------------put(存入数据到缓冲区)-------------------
position(正在操作数据位置):5
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
------------------flip(切换读取数据模式)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------get读取缓冲区中的数据-------------------
读取缓冲区中的数据:abcde
------------------get(读取缓冲区中的数据)-------------------
position(正在操作数据位置):5
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------rewind(重置可操作数据/可重复读)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
ab
2
------------------mark 标记后-------------------
cd
4
------------------reset 恢复到mark的位置-------------------
2
------------------获取缓冲区中所有剩余数据-------------------
3
缓冲区中的剩余数据:cd
JavaNIO缓冲区的更多相关文章
- Java-NIO(三):直接缓冲区与非直接缓冲区
直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...
- Java-NIO(二):缓冲区(Buffer)的数据存取
缓冲区(Buffer): 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通 ...
- javaNio 通道和缓冲区
/** * 大多数操作系统可以利用虚拟内存将文件或文件一部分映射到内存中,然后这个文件就可以被当做内存数组一样被访问:避免底层IO的开销<p> * [通道]是一种用于磁盘文件的一种抽象:& ...
- javaNIO(转载)
(一) Java NIO 概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Chan ...
- JAVANIO通道
package com.nio.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import j ...
- Java NIO Buffer缓冲区
原文链接:http://tutorials.jenkov.com/java-nio/buffers.html Java NIO Buffers用于和NIO Channel交互.正如你已经知道的,我们从 ...
- scanf()中清除输入缓冲区的几种方法归纳
应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...
- php缓冲区详解
什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...
- 缓冲区溢出利用——捕获eip的傻瓜式指南
[译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...
随机推荐
- oracle pl/sql 简介
一.pl/sql 是什么pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展.pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语 ...
- pytorch实现DCGAN、pix2pix、DiscoGAN、CycleGAN、BEGAN以及VAE
https://github.com/sunshineatnoon/Paper-Implementations
- 在JavaScript中使用json.js:Ajax项目之GET请求(同步)
1.用php编写一个提供数据的响应程序(phpdata.php) <?php $arr=array(1,2,3,4); //将数组编码为JSON格式的数据 $jsonarr=json_encod ...
- Delphi系列书籍pdf 118本 网友吐血整理
第一步:进入官网首页http://bulo.hujiang.com/home/ 第二部:home/替换u/779988/diary/627936/ 来自沪江部落
- vue学习之vue基本功能初探
vue学习之vue基本功能初探: 采用简洁的模板语法将声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div> ...
- HIVE---基于Hadoop的数据仓库工具讲解
Hadoop: Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用来开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Dist ...
- [Unity]Unity3D编辑器插件扩展和组件扩展
1. 插件扩展 1.1. 命名空间 using UnityEditor; using UnityEngine; //非必需,常用到 1.2. 使用语法 [MenuItem("Assets/M ...
- MongoDB学习教程(3)-常用命令
1.MongoDB 条件操作符 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. 在本章节中,我们将讨论如何在MongoDB中使用条件操作符. MongoDB中条件操作符有: (& ...
- 关于Struts与Ajax整合时的异常处理
关于Struts与Ajax整合时的异常处理问题: 问题还原: 从而当有异常发出时,会将异常信息发送到页面上.如下图所示:这是一个比较经典的过程: 错误提示页面: 由于sendError()方法里 ...
- Java面向对象 集合(上)
Java面向对象 集合(上) 知识概要: (1)体系概述 (2)共性方法 (3)迭代器 (4)list集合 (5)Set 集合 体系概述: 集 ...