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 }