public class TestBuffer {
<span style="color:#808080;"><em>/**

* . 缓冲区 (Buffer):Java Nio中负责数据的 存取+缓冲就是数组.用于存储不同类型的数据

*

* 根据类型不同(boolean 除外) 都提供了对应的缓冲区

* ByteBuffer

* CharBuffer

* ShortBuffer

*

* LongBuffer

* FloatBuffer

* DoubleBuffer

*

* 上述缓冲区的管理方式 几乎一致 通过allocate()获取缓冲区

*

* .缓冲区存取数据的两个核心方法

* put():存入数据到缓冲区中

* get():获取 缓冲区中的数据

*

*

* .缓冲区4个核心方法(Class:Buffer)

* 1.capacity 容量,表示缓冲区中最大存储的容量 一旦声明不能改写

* 2.limit 界限, 表示缓冲区可以操作数据的大小.(limit 后数据不能进行读写)

* 3.position 位置,表示缓冲区 正在操作数据的位置

* 4.mark 标记 表示当前position的位置 可以通过reset()恢复到 mark的位置

*

* 0 <=mark<= position<= limit<=capacity

*

* .直接缓冲区与非直接缓冲区:

* 非直接缓冲区:通过 allocate() 方法分配缓冲区, 将缓冲区建立在JVM的内存中

* 直接缓冲区: 通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中.可以提高效率

*/



public static void main(String[] args){

String str= "Hello world";

    <span style="color:#808080;"><em>//1.</em></span><span style="color:#808080;font-family:'宋体';"><em>分配一个大小

ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

System.out.println("--------------allocate初始化大小---------------");

System.out.println("position:"+byteBuffer.position());

System.out.println("limit:"+byteBuffer.limit());

System.out.println("capacity:"+byteBuffer.capacity());

    <span style="color:#808080;"><em>//2.</em></span><span style="color:#808080;font-family:'宋体';"><em>使用</em></span><span style="color:#808080;"><em>Put()</em></span><span style="color:#808080;font-family:'宋体';"><em>方法 存入缓冲区数据

byteBuffer.put(str.getBytes());

System.out.println("--------------allocate存入数据后的变化---------------");

System.out.println("position:"+byteBuffer.position());

System.out.println("limit:"+byteBuffer.limit());

System.out.println("capacity:"+byteBuffer.capacity());

    <span style="color:#808080;"><em>//3.</em></span><span style="color:#808080;font-family:'宋体';"><em>如要读取数据 需要切换模式 调用</em></span><span style="color:#808080;"><em>flip()

byteBuffer.flip();

    System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"--------------allocate</strong></span><span style="color:#008000;font-family:'宋体';"><strong>切换为读取模式的变化</strong></span><span style="color:#008000;"><strong>---------------"</strong></span>);
System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"position:"</strong></span>+byteBuffer.position());
System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"limit:"</strong></span>+byteBuffer.limit());
System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"capacity:"</strong></span>+byteBuffer.capacity()); <span style="color:#808080;"><em>//4.</em></span><span style="color:#808080;font-family:'宋体';"><em>用</em></span><span style="color:#808080;"><em>get </em></span><span style="color:#808080;font-family:'宋体';"><em>读取数据

byte[] dst = new byte[byteBuffer.limit()];

byteBuffer.get(dst);

System.out.println(new String(dst,0,dst.length));

System.out.println("--------------allocate切换为读取时的变化get()---------------");

System.out.println("position:"+byteBuffer.position());

System.out.println("limit:"+byteBuffer.limit());

System.out.println("capacity:"+byteBuffer.capacity());

    <span style="color:#808080;"><em>//5.rewind()</em></span><span style="color:#808080;font-family:'宋体';"><em>可重复读数据

byteBuffer.rewind();

System.out.println("--------------allocate切换为读取时的变化rewind()---------------");

System.out.println("position:"+byteBuffer.position());

System.out.println("limit:"+byteBuffer.limit());

System.out.println("capacity:"+byteBuffer.capacity());

    <span style="color:#808080;"><em>//6.clear() </em></span><span style="color:#808080;font-family:'宋体';"><em>清空缓冲区 但是缓冲区中的数据依然存在</em></span><span style="color:#808080;"><em>,</em></span><span style="color:#808080;font-family:'宋体';"><em>只是处于</em></span><span style="color:#808080;"><em>"</em></span><span style="color:#808080;font-family:'宋体';"><em>被遗忘</em></span><span style="color:#808080;"><em>"</em></span><span style="color:#808080;font-family:'宋体';"><em>状态

byteBuffer.clear();

System.out.println("---------------clear() 清空缓冲区--------------");

System.out.println("position:"+byteBuffer.position());

System.out.println("limit:"+byteBuffer.limit());

System.out.println("capacity:"+byteBuffer.capacity());

//读取第一个字符时 依然可以读取到

System.out.println((char)byteBuffer.get());

}

}


控制台输出:

--------------allocate初始化大小---------------
position:0
limit:1024
capacity:1024
--------------allocate存入数据后的变化---------------
position:11
limit:1024
capacity:1024
--------------allocate切换为读取模式的变化---------------
position:0
limit:11
capacity:1024
Hello world
--------------allocate切换为读取时的变化get()---------------
position:11
limit:11
capacity:1024
--------------allocate切换为读取时的变化rewind()---------------
position:0
limit:11
capacity:1024
---------------clear() 清空缓冲区--------------
position:0
limit:1024
capacity:1024
H

Java NIO的基本概念与使用的更多相关文章

  1. Java NIO通信的基础,基于TCP C/S例子介绍

    为了更好的理解Netty异步事件驱动网络通信框架,有必要先了解一点Java NIO原生的通信理论,下面将结合基于TCP的例子程序,含客户端和服务端的源码,实现了Echo流程. Java NIO的核心概 ...

  2. Java NIO之Java中的IO分类

    前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...

  3. Mina入门:Java NIO基础概念

    JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - ...

  4. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  5. JAVA NIO学习笔记1 - 架构简介

    最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...

  6. Java NIO (转)

    Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...

  7. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  8. Java - NIO

    java.nio:NIO-2: NIO 面向流的IO体系一次只能处理一个或多个字节/字符,直至读取所有字节/符,且流中的数据不能前后移动.效率低,当数据源中没有数据时会阻塞线程.Java-4提供的新A ...

  9. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

随机推荐

  1. Flume的client

    Client:生产数据,运行在一个独立的线程.

  2. HASH Partitioning--转载

    原文地址:https://dev.mysql.com/doc/refman/5.1/en/partitioning-hash.html HASH Partitioning [+/-] 18.2.3.1 ...

  3. Vue 打包后报错 Uncaught TypeError: Cannot redefine property: $router

    原因:就如报错提示所描述的,不能重新定义$router,说明是重复定了$router.通常是因为在项目中安装了vue-router的依赖并且用Vue.use()使用了vue-router,还在inde ...

  4. 自定义input[type="checkbox"]样式

    input[type=checkbox] { visibility: hidden; position: relative;} input[type=checkbox]:after { content ...

  5. CISP/CISA 每日一题 19

    CISSP 每日一题(答)What determines how often an audit should be performed? Risk     What policy requires u ...

  6. HTML基础第七讲---框架

    转自:https://i.cnblogs.com/posts?categoryid=1121494 框架(Frame)也就是所谓的分割窗口.分割画面.框窗效果(还真是五花八门),这个技巧在运用上问题比 ...

  7. kafka同步生产者和异步生产者深入剖析

    什么是kafka同步生产者,什么是kafka异步生产者? 比如这里某个topic有3个分区. kafka同步生产者:这个生产者写一条消息的时候,它就立马发送到某个分区去.  kafka异步生产者:这个 ...

  8. 解决Cookie乱码

    在Asp.net的HttpCookie中写入汉字,读取值为什么全是乱码?其实这是因 为文字编码而造成的,汉字是两个编码,所以才会搞出这么个乱码出来!其实解决的方法很简单:只要在写入Cookie时,先将 ...

  9. 微信消息体加解密及EncodingAESKey

    公众平台消息体签名及加解密方案概述 1.新增消息体签名验证,用于公众平台和公众账号验证消息体的正确性 2.针对推送给微信公众账号的普通消息和事件消息,以及推送给设备公众账号的设备消息进行加密 3.公众 ...

  10. JQuery map()函数

    DOM.map(callback(index,domElement)); 对匹配元素执行函数对象. 返回值是 jQuery 封装的数组,使用 get() 来处理返回的对象以得到基础的数组. 返回数据类 ...