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 ...
随机推荐
- 新版本mac 无法打开第三方应用
新版本mac 没有任何应用可以打开的这个选项 现在解决方法已经找到 特此标记一下 1打开终端 2 输入 sudo spctl --master-disable 3.打开系统设置的中的安全即可出现
- struts2一个和多个文件上传及下载
struts2的文件上传相比我们自己利用第三方jar包(commons-fileupload-1.2.1.jar commons-io-1.3.2.jar )要简单的多,当然struts2里面也是 ...
- mybatis 错误CGLIB is not available
### Error querying database. Cause: java.lang.IllegalStateException: Cannot enable lazy loading beca ...
- JSP入门 Listener
实现HttpSessionListener 编写一个OnlineUserListener类 package anni; import java.util.List; import javax.serv ...
- JSP静态化(伪静态)
关于URLRewirte的用法:该方法只是实现了url的伪静态化,并不是真正的静态化. URLRewirte版本:urlrewrite-2.6.0.jar URLRewirte的用处: 1.满足搜索引 ...
- JavaWeb(三)JSP概述
一.JSP概述 1.1.JSP简介 一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结束.JSP是一种Java servlet,主要用于实现 ...
- php中如何给类规范的注释
@access 使用范围:class,function,var,define,module 该标记用于指明关键字的存取权限:private.public或proteced @author 指明作者 @ ...
- php用PHPWord库生成word文档的例子
<?php require_once '../libs/PHPWord/PHPWord/IOFactory.php'; require_once '../../config.php'; $PHP ...
- Python自学笔记-进程,线程(Mr serven)
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...
- 802.1Q VLAN技术原理
文章出处:http://hi.baidu.com/x278384/item/d56b0edfd4f56a4eddf9be79 在数据通信和宽带接入设备里,只要涉及到二层技术的,就会遇到VLAN.而且, ...