Buffer 就像一个数组,可以保存多个相同类型的数据。根 据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:
上述 Buffer 类 他们都采用相似的方法进行管理数据,只是各自 管理的数据类型不同而已。都是通过如下方法获取一个 Buffer对象:
static XxxBuffer allocate(int capacity) : 创建一个容量为 capacity 的 XxxBuffer 对象
Buffer 所有子类提供了两个用于数据操作的方法:get() 与 put() 方法
_______________________________________________________________________
##七、实例
package com.gf.nio;
import org.junit.Test;
import java.nio.ByteBuffer;
/**
* 一、缓冲区(Buffer):在Java NIO 中负责数据的存取,缓冲区就是数组,用于存储不同数据类型的数据
*
* 根据数类型的不同(boolean 除外),提供了相应类型的的缓冲区:
* ByteBuffer
* CharBuffer
* ShortBuffer
* IntBuffer
* LongBuffer
* FloatBuffer
* DoubleBuffer
*
* 上述缓冲区的管理方式几乎一致,通过allocate() 获取缓冲区
*
* 二、缓冲区存取数据的两个核心的方法:
* put() : 存入数据到缓冲区中
* get() : 获取缓冲区中的数据
*
* 三、缓冲区中四个核心属性:
* capacity : 容量,表示缓冲区中最大存储数据的容量,一单声明不能改变
* limit : 界限,表示缓冲区可以操作数据大小(limit 后数据不能进行读取)
* position : 位置,表示缓冲区中正在操作数据的位置
*
* mark : 标记,表示记录当前position的位置,可以通过reset() 回复到mark位置
*
* 0 <= mark <= position <= limit <= capacity
*/
public class TestBuffer {
@Test
public void test1() {
String str = "abcde";
//1. 分配指定大小的缓冲区
System.out.println("----------allocate()----------");
ByteBuffer buf = ByteBuffer.allocate( 1024 );
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//2. 利用 put() 存入数据到缓冲区中
System.out.println("----------put()----------");
buf.put( str.getBytes() );
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//3. 切换到读取数据的模式
System.out.println("----------flip()----------");
buf.flip();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//4. 利用 get() 读取缓冲区中的数据
System.out.println("----------get()----------");
byte[] dst = new byte[buf.limit()];
buf.get(dst);
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//5. rewind() : 可重复读数据
System.out.println("----------rewind()----------");
buf.rewind();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//6. clear() : 清空缓冲区,但是缓冲区的数据依然存在,但是处于被遗忘状态
System.out.println("----------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());
buf.flip();
byte[] dst = new byte[buf.limit()];
buf.get( dst , 0 , 2 );
System.out.println(new String(dst , 0 , 2));
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//mark() : 标记
buf.mark();
buf.get( dst , 2, 2 );
System.out.println(new String(dst , 2 , 2));
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//reset() : 回复到 mark 的位置
buf.reset();
System.out.println(buf.position());
}
}
评论