NIO(一) - Buffer

package com.xbb.demo;

import org.junit.Test;

import java.nio.Buffer;
import java.nio.ByteBuffer;

/**
 * 一 : 缓冲区(Buffer):在Java NIO中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据
 *
 * 根据数据类型的不同(boolean除外),提供了相应类型的缓冲区
 *
 * ByteBuffer
 * charBuffer
 * ShortBuffer
 * IntBuffer
 * LongBuffer
 * FloatBuffer
 * DoubleBuffer
 *
 * 这些缓冲区的管理方式基本上都是相同的.通过allocate()获取缓冲区
 *
 * 二 : 缓冲区存取数据的两个核心方法
 *  put() : 存入数据到缓冲区
 *  get() : 从缓冲区获取数据
 *
 * 三 : 缓冲区中的四个核心属性
 *     position <= limit <= capacity
 *     // 标记,表示记录当前position的位置.可以通过reset()恢复到mark的位置
 *     private int mark = -1;
 *     // 位置 : 表示缓冲区中正在操作数据的位置.
 *     private int position = 0;
 *     // 界限 : 表示缓冲区可以操作数据的大小.(Limit后数据不能进行读写)
 *     private int limit;
 *     // 容量 : 表示缓冲区中最大存储数据的容量.一旦声明不能改变
 *     private int capacity;
 */
public class BufferDemo {
    /**
     * 普通操作
     */
    @Test
    public void test1(){
        // 分配一个指定大小的缓冲区
        ByteBuffer buf = ByteBuffer.allocate(1024);
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());
        System.out.println("----------put()--------------" );
        // 把数据存入缓冲区
        buf.put("abc".getBytes());
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        // 把数据取出来
        // flip 切换到读数据模式
        buf.flip();
        System.out.println("-----------get()-------------" );
        // 把数据存入缓冲区
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());
        byte[] dst = new byte[buf.limit()];
        buf.get(dst,0,buf.limit());
        System.out.println(new String(dst));
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        System.out.println("----------rewind()--------------" );
        // rewind() 指针回到起点位置,可以重复读取数据
        buf.rewind();
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        System.out.println("----------clear()--------------" );
        // clear() 恢复到最初状态,但是数据还是在的
        buf.clear();
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());
    }

    @Test
    public void test2(){
        String str = "abcde";
        ByteBuffer buf = ByteBuffer.allocate(1024);
        buf.put(str.getBytes());
        Buffer mark = buf.mark();
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());
        buf.flip();
        byte[] bytes = new byte[buf.limit()];
        buf.get(bytes,0,2);
        System.out.println(new String(bytes));
        System.out.println("----------get()--------------" );
        System.out.println(buf.position());
        buf.get(bytes,2,2);
        buf.mark();
        System.out.println(new String(bytes));
        System.out.println("----------get()--------------" );
        System.out.println(buf.position());
        System.out.println("----------clear()--------------" );
        System.out.println(buf.position());
        buf.reset();
        System.out.println(buf.position());
    }

    /**
     * 判断缓冲区是否还有可操作的数据
     */
    @Test
    public void hasRemain(){
        String str = "abcdefg";
        ByteBuffer buf = ByteBuffer.allocate(1024);
        buf.put(str.getBytes());
        buf.flip();
        while (buf.hasRemaining()){
            System.out.println("还有 " + buf.remaining() + " 个");
            System.out.println((char) buf.get());
        }
    }

}

上一篇:Java NIO:Buffer、Channel 和 Selector


下一篇:NIO(七) - 非阻塞试UDP通讯