1. 程式人生 > >Java NIO 系列教程(一)

Java NIO 系列教程(一)

概述

Java NIO是面向緩衝區的,基於通道的IO操作。

緩衝區與通道的基本原理敘述

通道:類似於生活中的鐵路,只用於連線,並沒有資料的傳輸。

這裡寫圖片描述

緩衝區:類似於火車,可以雙向的傳遞資料,比如說:運城到太原的火車,在運城上乘客後(乘客數量小於火車容量)(可以認為就是在寫資料),就可以往太原出發,(當然也可以在中途進行上下車)在太原後,乘客需要下車(類似於讀資料),重要的是這個火車在太原可以再次進行裝人(寫資料),並將人運輸到運城,以此類推。。。可知緩衝區是雙向的存取。

這裡寫圖片描述

由以上可知,在Java NIO中,由Channel面向傳輸,Buffer面向儲存。

Java 緩衝區操作

  1. 負責存取資料,緩衝區就是陣列,用於儲存不同型別的資料,java根據資料型別的不同(Boolean型別除外),提供了相應的緩衝區。

    • ByteBuffer
    • CharBuffer
    • IntBuffer
    • ShortBuffer
    • LongBuffer
    • DoubleBuffer

以上資料型別都可以通過allocate()來獲取緩衝區。

//建立緩衝區,分配一個指定大小(10)的緩衝區
ByteBuffer buf = ByteBuffer.allocate(10);
  1. 緩衝區:存取資料的核心方法包括兩種

    • put:存取資料到緩衝區
    • get:獲取緩衝區中的資料
  2. 四個主要核心屬性:

    • capacity:容量,表示緩衝區最大的儲存量,一旦宣告不能改變。
    • limit:界限,表示緩衝區中可以操作資料的大小(limit後的資料不能進行操作)
    • position:位置,表示緩衝區正在操作的資料的位置。
    • 關係:position<=limit<=capacity
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

輸出:0,10,10

圖解:

這裡寫圖片描述

//利用put方法,存入資料到緩衝區
String str = "abcde";
buf.put(str.getBytes());
System.out
.println(buf.position()); System.out.println(buf.capacity()); System.out.println(buf.limit());

輸出:5,10,10

圖解:

這裡寫圖片描述

//利用flip()方法,改變緩衝區模式將緩衝區從寫模式改變為讀模式
buf.flip();
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

輸出:0.10.5

圖解:

這裡寫圖片描述

//利用get方法讀取資料
byte [] bytes = new byte[buf.limit()];
buf.get(bytes);
System.out.println(new String(bytes));

輸出:abcde

圖解:

這裡寫圖片描述

//清空緩衝區,使緩衝區回到最初的狀態,資料並沒有清除,只是處於“被遺忘”狀態
buf.clear();
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

輸出:0,10,10

這裡寫圖片描述

//利用get方法來驗證被遺忘的資料
System.out.println((char)buf.get());

輸出:a

前面提及是四個核心屬性,上面只涉及前三個比較重要的屬性,現在來說明最後一個不是很重要的屬性。

  • Mark可以記錄當前position的位置,可以通過reset函式回到mark標記的位置。
String str = "abcde";
// 申請大小為10的緩衝區
ByteBuffer buf = ByteBuffer.allocate(10);
// 將資料存入緩衝區
buf.put(str.getBytes());
buf.flip();
byte[] bytes = new byte[buf.limit()];   buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));    buf.mark();
buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));
buf.reset();
buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));

輸出:ab cd cd

圖解:

申請:

這裡寫圖片描述

存入資料:

這裡寫圖片描述

讀取資料:

這裡寫圖片描述

mark標記:

這裡寫圖片描述

讀取資料:

這裡寫圖片描述

reset:

這裡寫圖片描述

讀取資料:

這裡寫圖片描述