Java NIO的基本概念与使用
Posted 星朝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java NIO的基本概念与使用相关的知识,希望对你有一定的参考价值。
public class TestBuffer { /** * 一. 缓冲区 (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"; //1.分配一个大小 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()); //2.使用Put()方法 存入缓冲区数据 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()); //3.如要读取数据 需要切换模式 调用flip() byteBuffer.flip(); System.out.println("--------------allocate切换为读取模式的变化---------------"); System.out.println("position:"+byteBuffer.position()); System.out.println("limit:"+byteBuffer.limit()); System.out.println("capacity:"+byteBuffer.capacity()); //4.用get 读取数据 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()); //5.rewind()可重复读数据 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()); //6.clear() 清空缓冲区 但是缓冲区中的数据依然存在,只是处于"被遗忘"状态 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的基本概念与使用的主要内容,如果未能解决你的问题,请参考以下文章