java nio 系列教程(1)----buffer介紹和使用方法
阿新 • • 發佈:2018-12-17
大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油
package com.zzh.buffer; import org.junit.jupiter.api.Test; import java.nio.ByteBuffer; /** * 一.緩衝區(buffer):在java nio中負責資料的存取.緩衝區就是陣列.用於儲存不同資料型別的資料 * 根據資料型別不同(boolean除外),提供了相應型別的緩衝區: *ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuffer * FloatBuffer * DoubleBuffer * 上述緩衝區的管理方式幾乎一致,通過allocate()獲取緩衝區 * * 二 緩衝區中的四個核心方法: * put() : 存入資料到緩衝區中 * get(): 獲取緩衝區中的資料 * flip():切換到讀資料模式 * rewind():重新讀(注意和flip的區別) * clear():清空,緩衝區中的資料依然存在,但是處於"被遺忘狀態" * * 三.緩衝區的四個核心屬性: * private int mark = -1; //標記,表示記錄當前postion的位置,可以通過reset()恢復到mark的位置 private int position = 0;//當前位置 private int limit;//可讀取的最大位置 private int capacity;//容量,表示緩衝區中最大儲存資料的容量.一旦宣告 *四,直接緩衝區與非直接緩衝區 * 非直接緩衝區:通過allocate方法分配緩衝區,將緩衝區建立在JVM的記憶體中 * 直接緩衝區:通過allocateDirect()方法分配直接緩衝區,將緩衝區建立在實體記憶體中,某些環境下可以直接提高效率 */ public class TestBuffer { public static void main(String[] args) { String name = "zzh"; //1.分配一個容量為1024的快取區 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); System.out.println("分配容量之後的緩衝區--------------"); System.out.println("position->"+byteBuffer.position()); System.out.println("limit->"+byteBuffer.limit()); System.out.println("capacity->"+byteBuffer.capacity()); //2.存入資料 byteBuffer.put(name.getBytes()); System.out.println("存入資料之後的緩衝區--------------"); System.out.println("position->"+byteBuffer.position()); System.out.println("limit->"+byteBuffer.limit()); System.out.println("capacity->"+byteBuffer.capacity()); /** * 3.切換到讀取資料模式 * 作用 * limit = position; 可訪問的位置=position position = 0; 將postion 置為0 mark = -1; */ byteBuffer.flip(); System.out.println("切換到讀取資料模式後的緩衝區--------------"); System.out.println("position->"+byteBuffer.position()); System.out.println("limit->"+byteBuffer.limit()); System.out.println("capacity->"+byteBuffer.capacity()); /** * 4.讀取資料 */ byte[] bytes = new byte[byteBuffer.limit()]; byteBuffer.get(bytes); System.out.println(new String(bytes, 0, bytes.length)); System.out.println("讀取資料後的緩衝區--------------"); System.out.println("position->"+byteBuffer.position()); System.out.println("limit->"+byteBuffer.limit()); System.out.println("capacity->"+byteBuffer.capacity()); /** * 5.rewind 注意和flip的區別 * 作用 * position = 0; mark = -1; */ byteBuffer.rewind(); System.out.println("rewind後的緩衝區--------------"); System.out.println("position->"+byteBuffer.position()); System.out.println("limit->"+byteBuffer.limit()); System.out.println("capacity->"+byteBuffer.capacity()); /** * clear(),清空緩衝區,只是四個核心屬性被初始化,緩衝區中的資料依然存在,但是處於"被遺忘狀態" */ byteBuffer.clear(); System.out.println("清空緩衝區後的緩衝區--------------"); System.out.println("position->"+byteBuffer.position()); System.out.println("limit->"+byteBuffer.limit()); System.out.println("capacity->"+byteBuffer.capacity()); /** * mark()標記一下 postion的位置 */ byteBuffer.mark(); /** * reset()恢復到mark標記的位置 */ byteBuffer.reset(); /** * hasRemaining緩衝區中是否有資料 */ byteBuffer.hasRemaining(); /** * 緩衝區中剩餘多少資料 */ int remaining = byteBuffer.remaining(); } @Test public void bufferDirect(){ //直接緩衝區 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024); } }