JavaNIO緩沖區
阿新 • • 發佈:2017-08-01
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緩沖區