——————戰神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 內部有三個結構
1 capacity 容量大小
2 position 當前讀或寫處理的位置(指針)
3limit 線程處理 寫入限制
首次limit 的位置是 緩衝區最大位置
在 讀和寫 切換的時候 Position位置是會變動的 例如 寫模式從0 寫入到位置4 後切換讀模式 那麼position就會重新變成0 而limit 就會變成寫模式position的位置 意思是你最多能讀取到剛剛寫到截止的那個位置
flip()方法//切換讀模式
clear()方法//切換至寫模式
讀模式讀取完畢後,在切換寫模式,position 又從新回到0了 因爲是又一次讀取了 可以覆蓋上一次的數據了
compact()方法 是對於緩衝區內未讀完的數據進行保留,而切換寫模式在保留數據的後面繼續寫,而不是像clear那樣全部刪除緩衝區