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 內部有三個結構

1 capacity 容量大小

2 position 當前讀或寫處理的位置(指針) 

 

 

3limit 線程處理 寫入限制

首次limit 的位置是 緩衝區最大位置

在 讀和寫 切換的時候 Position位置是會變動的  例如 寫模式從0 寫入到位置4 後切換讀模式 那麼position就會重新變成0 而limit 就會變成寫模式position的位置  意思是你最多能讀取到剛剛寫到截止的那個位置

flip()方法//切換讀模式

clear()方法//切換至寫模式

讀模式讀取完畢後,在切換寫模式,position 又從新回到0了 因爲是又一次讀取了 可以覆蓋上一次的數據了

compact()方法 是對於緩衝區內未讀完的數據進行保留,而切換寫模式在保留數據的後面繼續寫,而不是像clear那樣全部刪除緩衝區

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章