Java NIO 是由 Java 1.4 引進的異步 IO.
Java NIO 由如下幾個核心部分組成:segmentfault
Channel網絡
Buffer異步
Selector線程
IO 和 NIO 的區別主要體如今三個方面:指針
IO 基於流(Stream oriented), 而 NIO 基於 Buffer (Buffer oriented)事件
IO 操做是阻塞的, 而 NIO 操做是非阻塞的博客
IO 沒有 selector 概念, 而 NIO 有 selector 概念.select
傳統的 IO 是面向字節流或字符流的, 而在 NIO 中, 咱們拋棄了傳統的 IO 流, 而是引入了 Channel 和 Buffer 的概念. 在 NIO 中, 我只能從 Channel 中讀取數據到 Buffer 中或將數據從 Buffer 中寫入到 Channel.
那麼什麼是 基於流 呢? 在通常的 Java IO 操做中, 咱們以流式的方式順序地從一個 Stream 中讀取一個或多個字節, 所以咱們也就不能隨意改變讀取指針的位置.
而 基於 Buffer 就顯得有點不一樣了. 咱們首先須要從 Channel 中讀取數據到 Buffer 中, 當 Buffer 中有數據後, 咱們就能夠對這些數據進行操做了. 不像 IO 那樣是順序操做, NIO 中咱們能夠隨意地讀取任意位置的數據.方法
Java 提供的各類 Stream 操做都是阻塞的, 例如咱們調用一個 read 方法讀取一個文件的內容, 那麼調用 read 的線程會被阻塞住, 直到 read 操做完成.
而 NIO 的非阻塞模式容許咱們非阻塞地進行 IO 操做. 例如咱們須要從網絡中讀取數據, 在 NIO 的非阻塞模式中, 當咱們調用 read 方法時, 若是此時有數據, 則 read 讀取並返回; 若是此時沒有數據, 則 read 直接返回, 而不會阻塞當前線程.數據
selector 是 NIO 中才有的概念, 它是 Java NIO 之因此能夠非阻塞地進行 IO 操做的關鍵.
經過 Selector, 一個線程能夠監聽多個 Channel 的 IO 事件, 當咱們向一個 Selector 中註冊了 Channel 後, Selector 內部的機制就能夠自動地爲咱們不斷地查詢(select) 這些註冊的 Channel 是否有已就緒的 IO 事件(例如可讀, 可寫, 網絡鏈接完成等). 經過這樣的 Selector 機制, 咱們就能夠很簡單地使用一個線程高效地管理多個 Channel 了.
本文由 yongshun 發表於我的博客, 採用署名-非商業性使用-相同方式共享 3.0 中國大陸許可協議.非商業轉載請註明做者及出處. 商業轉載請聯繫做者本人Email: yongshun1228@gmail.com本文標題爲: Java NIO 的前生今世 之一 簡介本文連接爲: segmentfault.com/a/1190000006824091