NIO三大戰神
——————戰神1 Channel通道
Channel (通道)
常見的Channel
1 FileChannel 數據文件傳輸通道
2 DatagramChannel DUP網絡傳輸通道
3 SocketChannel TCP網絡傳輸通道
4ServerSocketChannel TCP網絡傳輸通道
——————戰神2Buffer 數據緩沖區
Buffer (數據的內存緩沖區)
常見的Buffer有
1 ByteBuffer 抽象類
實現類
MappedByteBuffer
DirectByteBuffer
HeapByteBuffer
2ShortBuffer
3IntBuffer
4LongBuffer
5FloatBuffer
6DoubleBuffer
7CharBuffer
——————戰神3Selector 選擇器
Selector 選擇器
1selector 是干什么的呢?
在我們傳統BIO上是針對每一個請求創建一個線程,每一個線程都是阻塞模式的,而且線程的資源終究是有限的, 即使選擇使用線程池也是很浪費資源,那么這個時候我們的selector就上場了

代碼案例:
public static void main(String[] args) {
try{
FileChannel channel = new FileInputStream("data.txt").getChannel();
//準備緩沖區
ByteBuffer buffer=ByteBuffer.allocate(10);//容量 10個字節
//從channel 讀取 寫入到buffer
while (true){
int len = channel.read(buffer);
System.out.print("讀取到的字節="+len);
if(len==-1){
break;
}
//打印buffer 內容
buffer.flip();//切換讀模式
while (buffer.hasRemaining()){
byte b= buffer.get();//讀一個字節
System.out.print((char)b);
}
buffer.clear();//切換為寫模式
}
}catch (Exception e){
e.printStackTrace();
}
}
}
ByteBuffer的使用

ByteBuffer 內部有三個結構
1 capacity 容量大小
2 position 當前讀或寫處理的位置(指針)

3limit 線程處理 寫入限制
首次limit 的位置是 緩沖區最大位置
在 讀和寫 切換的時候 Position位置是會變動的 例如 寫模式從0 寫入到位置4 后切換讀模式 那么position就會重新變成0 而limit 就會變成寫模式position的位置 意思是你最多能讀取到剛剛寫到截止的那個位置
flip()方法//切換讀模式
clear()方法//切換至寫模式
讀模式讀取完畢后,在切換寫模式,position 又從新回到0了 因為是又一次讀取了 可以覆蓋上一次的數據了
compact()方法 是對于緩沖區內未讀完的數據進行保留,而切換寫模式在保留數據的后面繼續寫,而不是像clear那樣全部刪除緩沖區
get(i)獲取指定下標的數據 position 位置不會變
public static void main(String[] args) {
ByteBuffer buffer= ByteBuffer.allocate(10);
buffer.put(new byte[]{'a','b','c','d'});
//切換讀模式
buffer.flip();
//從頭開始讀
buffer.get(new byte[4]);
System.out.println(buffer);
//從頭開始讀
buffer.rewind();
System.out.println((char) buffer.get());//讀取a
System.out.println((char) buffer.get());//讀取b
buffer.mark();//做標記 通常和reset()配合使用 reset是跳回上次標記的位置
System.out.println(buffer);
System.out.println((char) buffer.get());//讀取c
System.out.println((char) buffer.get());//讀取d
buffer.reset();// reset是跳回上次mark 標記的位置
System.out.println((char) buffer.get());//讀取c
}


浙公網安備 33010602011771號