摘要:簡介是由引進的異步由以下幾個核心部分組成和的對比和的區(qū)別主要體現(xiàn)在三個方面基于流而基于操作是阻塞的而操作是非阻塞的沒有概念而有概念基于與基于傳統(tǒng)的是面向字節(jié)流或字符流的而在中我們拋棄了傳統(tǒng)的流而是引入了和的概念在中我只能從中讀取數(shù)據(jù)到中或?qū)?/p>
簡介
Java NIO 是由 Java 1.4 引進的異步 IO.
Java NIO 由以下幾個核心部分組成:
Channel
Buffer
Selector
NIO 和 IO 的對比IO 和 NIO 的區(qū)別主要體現(xiàn)在三個方面:
IO 基于流(Stream oriented), 而 NIO 基于 Buffer (Buffer oriented)
IO 操作是阻塞的, 而 NIO 操作是非阻塞的
IO 沒有 selector 概念, 而 NIO 有 selector 概念.
基于 Stream 與基于 Buffer傳統(tǒng)的 IO 是面向字節(jié)流或字符流的, 而在 NIO 中, 我們拋棄了傳統(tǒng)的 IO 流, 而是引入了 Channel 和 Buffer 的概念. 在 NIO 中, 我只能從 Channel 中讀取數(shù)據(jù)到 Buffer 中或?qū)?shù)據(jù)從 Buffer 中寫入到 Channel.
那么什么是 基于流 呢? 在一般的 Java IO 操作中, 我們以流式的方式順序地從一個 Stream 中讀取一個或多個字節(jié), 因此我們也就不能隨意改變讀取指針的位置.
而 基于 Buffer 就顯得有點不同了. 我們首先需要從 Channel 中讀取數(shù)據(jù)到 Buffer 中, 當 Buffer 中有數(shù)據(jù)后, 我們就可以對這些數(shù)據(jù)進行操作了. 不像 IO 那樣是順序操作, NIO 中我們可以隨意地讀取任意位置的數(shù)據(jù).
Java 提供的各種 Stream 操作都是阻塞的, 例如我們調(diào)用一個 read 方法讀取一個文件的內(nèi)容, 那么調(diào)用 read 的線程會被阻塞住, 直到 read 操作完成.
而 NIO 的非阻塞模式允許我們非阻塞地進行 IO 操作. 例如我們需要從網(wǎng)絡中讀取數(shù)據(jù), 在 NIO 的非阻塞模式中, 當我們調(diào)用 read 方法時, 如果此時有數(shù)據(jù), 則 read 讀取并返回; 如果此時沒有數(shù)據(jù), 則 read 直接返回, 而不會阻塞當前線程.
selector 是 NIO 中才有的概念, 它是 Java NIO 之所以可以非阻塞地進行 IO 操作的關鍵.
通過 Selector, 一個線程可以監(jiān)聽多個 Channel 的 IO 事件, 當我們向一個 Selector 中注冊了 Channel 后, Selector 內(nèi)部的機制就可以自動地為我們不斷地查詢(select) 這些注冊的 Channel 是否有已就緒的 IO 事件(例如可讀, 可寫, 網(wǎng)絡連接完成等). 通過這樣的 Selector 機制, 我們就可以很簡單地使用一個線程高效地管理多個 Channel 了.
本文由 yongshun 發(fā)表于個人博客, 采用署名-非商業(yè)性使用-相同方式共享 3.0 中國大陸許可協(xié)議.
非商業(yè)轉(zhuǎn)載請注明作者及出處. 商業(yè)轉(zhuǎn)載請聯(lián)系作者本人
Email: [email protected]
本文標題為: Java NIO 的前生今世 之一 簡介
本文鏈接為: segmentfault.com/a/1190000006824091
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65103.html
摘要:背景在工作中雖然我經(jīng)常使用到庫但是很多時候?qū)Φ囊恍└拍钸€是處于知其然不知其所以然的狀態(tài)因此就萌生了學習源碼的想法剛開始看源碼的時候自然是比較痛苦的主要原因有兩個第一網(wǎng)上沒有找到讓我滿意的詳盡的源碼分析的教程第二我也是第一次系統(tǒng)地學習這么大代 背景 在工作中, 雖然我經(jīng)常使用到 Netty 庫, 但是很多時候?qū)?Netty 的一些概念還是處于知其然, 不知其所以然的狀態(tài), 因此就萌生了學...
摘要:目錄源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結(jié)的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環(huán)境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端源碼分析之一揭開神秘的紅蓋頭服務器 目錄 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 簡介 Java NIO 的前生今世 ...
摘要:目錄源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結(jié)的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環(huán)境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端源碼分析之一揭開神秘的紅蓋頭服務器 目錄 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 簡介 Java NIO 的前生今世 ...
摘要:目錄源碼之下無秘密做最好的源碼分析教程源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結(jié)的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環(huán)境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端 目錄 源碼之下無秘密 ── 做最好的 Netty 源碼分析教程 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NI...
摘要:通常來說所有的的操作都是從開始的一個類似于一個和對比我們可以在同一個中執(zhí)行讀和寫操作然而同一個僅僅支持讀或?qū)懣梢援惒降刈x寫而是阻塞的同步讀寫總是從中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入到中類型有文件操作操作操作操作使用在服務器端這些通道涵蓋了和網(wǎng)絡以及文件 Java NIO Channel 通常來說, 所有的 NIO 的 I/O 操作都是從 Channel 開始的. 一個 channel 類似于一個 ...
閱讀 3330·2021-11-25 09:43
閱讀 1314·2021-11-23 09:51
閱讀 3617·2021-10-11 11:06
閱讀 3729·2021-08-31 09:41
閱讀 3607·2019-08-30 15:53
閱讀 3517·2019-08-30 15:53
閱讀 974·2019-08-30 15:43
閱讀 3317·2019-08-29 14:02