Java NIO

        作爲C/C++程序員,初次聽到Java NIO這個名詞有點茫然。仔細學習了Java NIO的細節和用法,個人理解如下:

        其實Java NIO的功能對C程序員並不陌生,和我們經常接觸的 select / poll / epoll 是類似的。本質上Java NIO在Linux 2.6內核之後就是通過epoll來實現。

        不論 Java NIO還是 C中的 select / poll / epoll, 其設計思路就是對傳統的阻塞型 I/O 做補充完善,實現非阻塞 I/O;

        我們知道,在傳統的阻塞型I/O中,accept()等待過程中若沒有新的連接請求到來,就一直阻塞;請求讀寫過程在等待數據時也會阻塞。考慮到每來一個新連接通常需要開啓一個新線程去處理,如果許多線程處在阻塞狀態,無疑是對計算資源的浪費。

         Java NIO提供事件驅動的非阻塞型I/O,面對多個連接請求(不論是來自塊設備還是Socket連接)的情況,可以把衆多連接偵聽放在一個或儘可能少的進程中進行管理,請求到達時則可以派發給相關線程處理。這對於處理高併發且所需響應時間很短的event,將會非常高效。

          當然,Java NIO還提供了所謂的塊讀寫, 相比Java IO有優勢。傳統的Java IO, 程序需要生成Java對象(比較多的是String類型)來存儲每次從連接中讀到的數據,處理數據後這些臨時的對象又要被釋放。極端情況下,如果每次讀取1字節數據,這種臨時對象的創建和刪除會相當低效。Java NIO提供了Buffer讀寫功能,數據從連接讀出後直接存放到Buffer(緩存)中,無需字符串對象做中間存儲,這就減少了不必要的性能和資源損耗。

          先總結這麼多,若有不當之處還請Java高手指正。最後還是要Highlight 下IBM的高質量文檔,下面這篇關於Java NIO入門的介紹非常經典,可以作爲學習參考:

          http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html


發佈了55 篇原創文章 · 獲贊 5 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章