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缓冲区的更多相关文章

  1. Java-NIO(三):直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...

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

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

  3. javaNio 通道和缓冲区

    /** * 大多数操作系统可以利用虚拟内存将文件或文件一部分映射到内存中,然后这个文件就可以被当做内存数组一样被访问:避免底层IO的开销<p> * [通道]是一种用于磁盘文件的一种抽象:& ...

  4. javaNIO(转载)

    (一) Java NIO 概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Chan ...

  5. JAVANIO通道

    package com.nio.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import j ...

  6. Java NIO Buffer缓冲区

    原文链接:http://tutorials.jenkov.com/java-nio/buffers.html Java NIO Buffers用于和NIO Channel交互.正如你已经知道的,我们从 ...

  7. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

  8. php缓冲区详解

    什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...

  9. 缓冲区溢出利用——捕获eip的傻瓜式指南

    [译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...

随机推荐

  1. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  2. 个人从源码理解JIT模式下angular编译AppModule的过程

    承接上文.笔者之前将一个angular项目的启动过程分为了两步: 创建平台得到 PlatformRef ,以及执行平台引用提供的方法编译根模块 AppModule .本文就将着眼于创建好的平台,从an ...

  3. MySQL主从同步和读写分离的配置

    主服务器:192.168.1.126 从服务器:192.168.1.163 amoeba代理服务器:192.168.1.237 系统全部是CentOS 6.7 1.配置主从同步 1.1.修改主服务器( ...

  4. 剑指offer(纪念版) 面试题3:二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   第一种方法题目说不可行 ...

  5. springmvc入门程序

    学习java有好几个月了,今天才想起每天学习的东西还是会忘记,所以准备开始每天把头一天学习的东西写在博客上,首先也不会写博客,文笔比较差劲,但是为了学习和巩固,也方便以后可以查看.温习. 昨天看了下s ...

  6. html表格宽度设置失效

    问题描述: 我在写一个网页table时,table宽度超过了我预想的宽度,我想把它设置小一点,但总是没效果.改到怀疑人生!代码如下: 经过多次调试后发现一个问题,table可以改变大小,但是会有一个最 ...

  7. asp.net core封装layui组件示例分享

    用什么封装?自然是TagHelper啊,是啥?自己瞅文档去 在学习使用TagHelper的时候,最希望的就是能有个Demo能够让自己作为参考 怎么去封装一个组件? 不同的情况怎么去实现? 有没有更好更 ...

  8. Linux下搭建tomcat和jre的环境

    1.下载linux版本的tomcat和jre tomcat下载:http://pan.baidu.com/s/1nt7D87J: jre下载:http://pan.baidu.com/s/1sj4hA ...

  9. 设置Intel网卡以抓取报文的vlan tag

    一.实验环境 1.ThinkPad T450 Notebook 2.Notebook网卡Intel I218-V 二.设置步骤 1."设备管理器" -> "Inte ...

  10. SqlServer2008 导入导出txt或Execl数据

    --右键user表所在的数据库,然后任务--导出数据,然后根据提示设置就行 --从txt中导入 EXEC master..xp_cmdshell 'bcp Northwind.dbo.sysusers ...