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. Python NLP入门教程

    本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库.NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库. 什么是NLP? 简单来说,自然 ...

  2. TEXT宏

    TEXT宏是windows程序设计中经常遇到的宏,定义在 <winnt.h>中 TCHAR *P = TEXT("this is a const string"); 如 ...

  3. es6函数的rest参数和拓展运算符(...)的解析

    es6的新特性对函数的功能新增加了rest参数和...的拓展运算符.这是两个什么东西呢? 先来看一个问题:如何获取一个函数除了定义的参数之外的其他参数?传统的做法是借助函数的arguments关键字来 ...

  4. [mysql] ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES).

    用mysql -u root -p显示ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YE ...

  5. hdu3065 ac自动机

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. 用ESP8266+android,制作自己的WIFI小车(Android 软件)

    先说一下这篇文章里面的内容:TCP 客户端, 自定义对话框, 自定义按钮, ProgressBar竖直显示, 重力感应传感器,手机返回键新开启界面的问题(返回上次的界面),数据保存 软件的通信是配合 ...

  7. ubuntu远程桌面介绍

    一.windows远程ubuntu14.04 由于xrdp.gnome和unity之间的兼容性问题,在Ubuntu 14.04版本中仍然无法使用xrdp登陆gnome或unity的远程桌面,现象是登录 ...

  8. structs2的核心和工作原理

     在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的 ...

  9. Win10打补丁KB4022725出现0x80073712错误

    周末从老家回来折腾电脑,发现又收到了一大堆补丁,其中包括6月累积更新KB4022725.在安装过程中,一不小心手滑碰到了插线板,电脑断电了!!尼玛,这是要悲催的节奏么? 重新上完电开机,开机界面显示正 ...

  10. 关于python安装一些包时出现的错误解决方法

    1.关于wordcloud的安装 --win10,py3.6环境下安装总是出现安装错误,解决方法,下载wordcloud的wheel文件,进行安装. 详情参考:https://github.com/a ...