1 package com.slp.nio; 2 3 import org.junit.Test; 4 5 import java.nio.ByteBuffer; 6 7 /** 8 * Created by sanglp on 2017/3/1. 9 * 一、缓冲区:在Java nio中负责数据的存储。缓冲区就是数据,用于村塾不同数据类型的数据 10 * 根据数据类型的不同(boolean类型除外),提供了相应类型的缓冲区 11 * ByteBuffer 12 * CharBuffer 13 * ShortBuffer 14 * IntBuffer 15 * FloatFuffer 16 * DoubleBuffer 17 * 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区 18 * 二、缓冲区有存取数据的两个核心方法 19 * put()存储数据到缓冲区中 20 * get()获取缓冲区中的数据 21 * 三、缓冲区的四个核心属性 22 * capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明就不能改变 23 * limit:界限 表示缓冲区中可以操作数据的大小 limit后数据不能进行读写 24 * position:位置 缓冲区中正在操作数据的位置 25 * mark:标记 表示记录当前position的位置,可以通过reset()或辅导mark的位置 26 * 0<=mark<=position<=limit<=capacity 27 * 28 * 四、直接缓冲区与非直接缓冲区 29 * 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存中 30 * 直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中 31 */ 32 public class TestBuffer { 33 34 @Test 35 public void test3(){ 36 ByteBuffer buffer = ByteBuffer.allocateDirect(1024); 37 System.out.println(buffer.isDirect());//true 38 } 39 @Test 40 public void test2(){ 41 String str="asdfgh"; 42 ByteBuffer buffer = ByteBuffer.allocate(1024); 43 buffer.put(str.getBytes()); 44 buffer.flip(); 45 buffer.get(new byte[buffer.limit()],0,2); 46 System.out.println(new String(new byte[buffer.limit()],0,2)); 47 System.out.println(buffer.position());//2 48 //标记 49 buffer.mark(); 50 buffer.get(new byte[buffer.limit()],2,2); 51 System.out.println(new String(new byte[buffer.limit()],2,2)); 52 System.out.println(buffer.position());//4 53 //reset()恢复到mark的位置 54 buffer.reset(); 55 System.out.println(buffer.position());//2 56 //判断缓冲区中对否有 57 if(buffer.hasRemaining()){ 58 System.out.println(buffer.remaining());//4 59 } 60 } 61 62 @org.junit.Test 63 public void test(){ 64 String str="ABCDE"; 65 //1、分配一个指定大小的缓冲区 66 ByteBuffer buf = ByteBuffer.allocate(1024); 67 System.out.println(buf.position());//0 68 System.out.println(buf.limit());//1024 69 System.out.println(buf.capacity());//1024 70 //2、利用put()存入数据到缓冲区 71 buf.put(str.getBytes()); 72 System.out.println(buf.position());//5 73 System.out.println(buf.limit());//1024 74 System.out.println(buf.capacity());//1024 75 //3、切换为读取数据的模式 76 buf.flip(); 77 System.out.println(buf.position());//0 78 System.out.println(buf.limit());//5 79 System.out.println(buf.capacity());//1024 80 //4、读取缓冲区中的数据 81 byte [] dest = new byte[buf.limit()]; 82 buf.get(dest); 83 System.out.println(new String(dest,0,dest.length));//ABCDE 84 System.out.println(buf.position());//5 85 System.out.println(buf.limit());//5 86 System.out.println(buf.capacity());//1024 87 88 //5。rewind()可重复读数据 89 buf.rewind(); 90 System.out.println(buf.position());//0 91 System.out.println(buf.limit());//5 92 System.out.println(buf.capacity());//1024 93 //6、清空缓冲区 但是缓冲区中的数据依然存在,但是处于被遗忘状态 94 buf.clear(); 95 System.out.println(buf.position());//0 96 System.out.println(buf.limit());//1024 97 System.out.println(buf.capacity());//1024 98 System.out.println((char)buf.get());//A 99 } 100 }
时间: 2024-12-31 05:22:04