io是面向流的,而nio是面向緩衝區的;
io每次從流中讀取乙個或者多個位元組,直到讀取完所有的位元組,這就意外著它是阻塞式的,當乙個執行緒執行read或者write的時候,這個執行緒是不能夠再去做其他的事情了;
nio會讀取資料放到乙個緩衝區裡,這樣可以增加讀取資料的靈活性,可以前後移動讀取資料的位置,它是非阻塞的,它大概由以下組成部分:
channel即通道、buffer即緩衝區、selector即選擇器
channel可以是單向通道也可以是雙向通道,雙向通道實現了讀和寫的介面,單向通道只實現了其中的乙個;需要注意的是,通過fileinputstream獲取的channel雖然實現了讀寫兩個介面,
但是由於fileinputstream是以讀檔案的許可權開啟檔案的,所以這個時候執行write方法的時候是會丟擲異常的;
可以以乙個簡單的生活例子來形容nio:
三兩個好友一起去餐廳吃飯,坐下來的時候,招手叫服務員過來點菜,點完菜之後服務員在前台會有一張單記錄是哪個餐桌點了哪些菜,然後就開始讓師傅去做菜,三兩個好友在等菜上來的這段時間,
可以吹吹水,閒聊人生,亦或者可以搖色子,喝喝酒,等到菜烹飪好了的時候,師傅端著菜過來問服務員是哪個桌子的菜,服務員檢視了記錄單之後確定了是那張桌子的菜,告訴師傅端過去了,等菜上了的時候,
三兩個好友停下了搖色子之類的事,開始吃飯了。
這是生活中乙個很簡單又貼切的例子,解釋一下:記錄單就相當於是selector,服務員就相當於selector的輪詢執行緒,三兩個好友點菜就相當於向selector註冊事件,
總結起來就是:
假設現在有個客戶端和服務端建立了雙向的channel,以服務端為例,它會向selector註冊讀和寫事件,selector會有乙個單獨的執行緒去輪詢,看看是否有可用的時間到達,如果有則執行事件,比如現在客戶端向
服務端傳送了資料,selector的執行緒會找到讀事件,然後就開始從buffer裡面讀取資料
IO模型之NIO快速理解
什麼是nio?nio是乙個非阻塞的就是說,他在accept 的時候不會阻塞,在read 的時候也不會阻塞,和之前的bio不同。假設有一萬個連線,如果是bio那核心就必須丟擲1萬個執行緒去處理,但是nio確不用,他可能只需要幾百個就行。為什麼nio可以做到這樣呢?是因為nio的3大核心。nio non...
NIO與IO讀檔案
對於讀檔案nio與io誰快?如果加一些複雜環境,然後再讓他們去讀檔案呢?為了得到這個答案,我做了兩組實驗,首先是直接單執行緒去讀乙個很大的檔案,分別通過nio和io去讀 nio 讀 param filename public static void readfilewithnio string fi...
IO與NIO的區別
一 實現方式 傳統io 1.傳統的socket io當客戶端和服務端連線成功後,服務端在進行讀取客戶端傳送的資訊的時候是通過新建執行緒來處理的,由此帶來了乙個問題,當有大量客戶端想服務端傳輸資料的時候,服務端就會啟動大量執行緒,這樣將大大的增加了伺服器的壓力。2.同時,傳統io通訊是阻塞的,即在讀取...