【Java nio】buffer

  

  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 }
原文地址:https://www.cnblogs.com/dream-to-pku/p/6505525.html