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