import java.nio.ByteBuffer;
import org.junit.Test;
public class Nio01 {
/*
* 一、緩衝區(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
*
* 四、直接緩衝區與非直接緩衝區:
* 非直接緩衝區:通過 allocate() 方法分配緩衝區,將緩衝區建立在 JVM 的內存中
* 直接緩衝區:通過 allocateDirect() 方法分配直接緩衝區,將緩衝區建立在物理內存中。可以提高效率
*/
@Test
public void test03(){
//創建直接緩衝區
ByteBuffer bff=ByteBuffer.allocateDirect(1024);
System.out.println(bff.position());
}
@Test
public void test02(){
String str="sdsaffffffffffffff";
//非直接緩衝區
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
byteBuffer.put(str.getBytes());
byteBuffer.flip();
byte[] ba=new byte[byteBuffer.limit()];
byteBuffer.get(ba,0,2);
System.out.println(new String(ba, 0, 2));
//標記
byteBuffer.mark();
byteBuffer.get(ba,2,4);
System.out.println(new String(ba, 2, 4));
//恢復 到mark的位置
byteBuffer.reset();
System.out.println(byteBuffer.position());
}
@Test
public void test01(){
String str="ds1.///[}/?s45465ss436suyj/l;ss765sss2312sssdasfdsgfdhfhtryh34t64weg";
//分配緩衝區大小 直接緩衝區
ByteBuffer buf=ByteBuffer.allocate(1024);
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//數據放置到緩存區
buf.put(str.getBytes());
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//切換讀取數據的模式
buf.flip();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//讀取數據
byte[] bat=new byte[buf.limit()];
buf.get(bat);
System.out.println(new String(bat,0,bat.length));
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//可重複讀取
buf.rewind();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//清空緩衝區 但是緩衝區中的數據依然存在,但是處於“被遺忘”狀態
buf.clear();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
}
}
Java NIO-之緩衝區Buffer
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.