Java NIO 系列教程(一)
阿新 • • 發佈:2019-01-30
概述
Java NIO是面向緩衝區的,基於通道的IO操作。
緩衝區與通道的基本原理敘述
通道:類似於生活中的鐵路,只用於連線,並沒有資料的傳輸。
緩衝區:類似於火車,可以雙向的傳遞資料,比如說:運城到太原的火車,在運城上乘客後(乘客數量小於火車容量)(可以認為就是在寫資料),就可以往太原出發,(當然也可以在中途進行上下車)在太原後,乘客需要下車(類似於讀資料),重要的是這個火車在太原可以再次進行裝人(寫資料),並將人運輸到運城,以此類推。。。可知緩衝區是雙向的存取。
由以上可知,在Java NIO中,由Channel面向傳輸,Buffer面向儲存。
Java 緩衝區操作
負責存取資料,緩衝區就是陣列,用於儲存不同型別的資料,java根據資料型別的不同(Boolean型別除外),提供了相應的緩衝區。
- ByteBuffer
- CharBuffer
- IntBuffer
- ShortBuffer
- LongBuffer
- DoubleBuffer
以上資料型別都可以通過allocate()來獲取緩衝區。
//建立緩衝區,分配一個指定大小(10)的緩衝區
ByteBuffer buf = ByteBuffer.allocate(10);
緩衝區:存取資料的核心方法包括兩種
- put:存取資料到緩衝區
- get:獲取緩衝區中的資料
四個主要核心屬性:
- 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:
讀取資料: