1. 程式人生 > >JavaNIO緩沖區

JavaNIO緩沖區

rewind() junit author sys 讀取 是否 不同 標記 存儲

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緩沖區