JavaNIO缓冲区

Posted fliay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaNIO缓冲区相关的知识,希望对你有一定的参考价值。

package com.nio.test;

import java.nio.ByteBuffer;

import org.junit.Test;

/**
 * 
 * @author fliay
 *
 *	一、缓冲区(buffer)
 *	根据数据类型不同(boolean)除外,提供了相应类型的缓冲区;
 *	ByteBuffer
 *	CharBuffer
 *	ShortBuffer
 *	IntBuffer
 *	LongBuffer
 *	FloatBuffer
 *	BoubleBuffer
 *	上述缓冲区的管理方式几乎一致,通过allocate() 获取缓冲区
 *
 *	二、缓冲区存取数据的两个核心方法:
 *		1.put(): 存入数据到缓冲区中
 *		2.get(): 获取缓冲区中的数据
 *	
 *	三、缓冲区中的四个核心属性:
 *		1.capacity: 容量,表示缓冲区最大存储数据的容量。
 *		2.limit:	界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
 *		3.position:	位置,表示缓冲区中正在操作数据的位置。
 *		4.mark:		标记,表示记录当前position的位置,可以通过reset() 恢复到mark的位置		
 *
 *
 *		0 <= mark <= position <= limit <= capacity
 *
 */



public class TestBuffer {
	
	
	@Test
	public void test1(){
		
		String str = "abcde";
		//1.分配一个指定大小的缓冲区
		ByteBuffer buf = ByteBuffer.allocate(1024);
		
		System.out.println("------------------allocate(分配指定大小的缓冲区)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
		
		//2.利用put() 存入数据到缓冲区
		buf.put(str.getBytes());
		
		System.out.println("------------------put(存入数据到缓冲区)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
		
		//3.切换读取数据数据模式
		buf.flip();
		
		System.out.println("------------------flip(切换读取数据模式)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
		
		//4.利用get() 读取缓冲区中的数据
		System.out.println("------------------get读取缓冲区中的数据-------------------");
		byte[]	s = new byte[buf.limit()];
		buf.get(s);
		System.out.println("读取缓冲区中的数据:"+new String(s,0,s.length));
		
		System.out.println("------------------get(读取缓冲区中的数据)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
		
		//5.rewind()可重复读
		buf.rewind();
		System.out.println("------------------rewind(重置可操作数据/可重复读)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
		
		//6.clear() 清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态
		buf.clear();
		System.out.println("------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
		
	}
	
	@Test
	public void test2(){
		String str="abcde";
		ByteBuffer buf = ByteBuffer.allocate(1024);
		buf.put(str.getBytes());
		buf.flip();
		byte[] b = new byte[buf.limit()];
		buf.get(b,0,2);
		System.out.println(new String(b,0,2));
		System.out.println(buf.position());
		//mark()标记
		buf.mark();
		System.out.println("------------------mark 标记后-------------------");
		buf.get(b, 2, 2);
		System.out.println(new String(b,2,2));
		System.out.println(buf.position());
		
		System.out.println("------------------reset 恢复到mark的位置-------------------");
		//reset 恢复到mark的位置
		buf.reset();
		System.out.println(buf.position());
		//判断缓冲区中是否还有剩余数据
		if(buf.hasRemaining()){
			System.out.println("------------------获取缓冲区中所有剩余数据-------------------");
			System.out.println(buf.remaining());
			
			System.out.println("缓冲区中的剩余数据:"+new String(b,buf.position(),buf.remaining()));
		}
		
	}
	
	

}

  输出结果

------------------allocate(分配指定大小的缓冲区)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
------------------put(存入数据到缓冲区)-------------------
position(正在操作数据位置):5
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
------------------flip(切换读取数据模式)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------get读取缓冲区中的数据-------------------
读取缓冲区中的数据:abcde
------------------get(读取缓冲区中的数据)-------------------
position(正在操作数据位置):5
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------rewind(重置可操作数据/可重复读)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
ab
2
------------------mark 标记后-------------------
cd
4
------------------reset 恢复到mark的位置-------------------
2
------------------获取缓冲区中所有剩余数据-------------------
3
缓冲区中的剩余数据:cd

  

以上是关于JavaNIO缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

JavaNio之ByteBuffer

JavaNio之ByteBuffer

javaNio 通道和缓冲区

Java NIO 系列教程

002-JavaNIO

NIOBuffer 缓冲区