1. 程式人生 > >面經·Java·(B)IO/NIO/AIO

面經·Java·(B)IO/NIO/AIO

Java中高手加QQ群498238384 備註:Java中高手- 呢稱

如果對您有幫助,麻煩在右邊點個贊哦~~

  • 什麼是IO、NIO、AIO?
  • 講一講Channel 和 Buffer
  • 講一講selector
  • directBuffer和buffer的區別
  • 什麼是IO、NIO、AIO?
    • NIO 指新IO,核心是非阻塞,解決傳統IO的阻塞問題。操作物件是Buffer

      • 其實NIO的核心是IO執行緒池,一定要記住這個關鍵點。

      • NIO中的IO多路複用呼叫系統級別的select和poll模型,由系統進行監控IO狀態,避免使用者執行緒通過反覆嘗試的方式查詢狀態

    • AIO即Asynchronous I/O(非同步非阻塞 I/O),這是Java 1.7引入的NIO 2.0中用到的。

  • 講一講Channel 
    • 一個Channel(通道)代表和某一實體的連線,這個實體可以是檔案、網路套接字等。既可以讀又可以寫。而流是單向的。

  • 講一講selector
    • Selector 為Channel服務,Channel為要訪問的資料服務。

    • selector採集各個channel的狀態(或者說監聽事件:

      • Accept:有可以接受的連線
      • Connect:連線成功
      • Read:有資料可讀
      • Write:可以寫入資料了
      • 程式設計師通過將通道註冊到選擇器,並設定好關心的事件,然後就可以通過呼叫select()方法,靜靜地等待事件發生。 避免了反覆主動嘗試Read()、write()、accept()、connnect()操作。

        作用舉例:避免因為沒有資料到達而反覆嘗試read().(耗費CPU)。

    • 為什麼要用selector,類似於為什麼要select的問題

      • 前文說了,如果用阻塞I/O,需要多執行緒(浪費記憶體)如果用非阻塞I/O,需要不斷重試(耗費CPU)。Selector的出現解決了這尷尬的問題,非阻塞模式下,通過Selector,我們的執行緒只為已就緒的通道工作(約等於已準備好的資料),不用盲目的重試了。比如,當所有通道都沒有資料到達時,也就沒有Read事件發生,我們的執行緒會在select()方法處被掛起,從而讓出了CPU資源。

  • Buffer

    • Buffer是緩衝區,不像傳統IO中那樣直接使用byte陣列,它是封裝過的。

    • (注意:將Buffer資料 寫入 通道是通道 讀取 操作,從通道 讀取 資料到Buffer是Buffer 寫入 操作)

    • 與Java基本型別相對應,NIO提供了多種 Buffer 型別,如ByteBuffer、CharBuffer、IntBuffer等,區別就是讀寫緩衝區時的單位長度不一樣(以對應型別的變數為單位進行讀寫)。

      Buffer中有3個很重要的變數,它們是理解Buffer工作機制的關鍵,分別是

      • capacity (總容量)
      • position (指標當前位置)
      • limit (讀/寫邊界位置)
  • directBuffer和buffer的區別