最近在學習nio,根據學習總結了一下,如果有不對的地方,請大佬指出。
nio,就是new io,從jdk 1.4開始引入的新的api,它跟io的作用相同。它與傳統的io相比,有如下特性:
1)nio是面向緩衝區的,io是面向流的。
2)io是阻塞的操作,如果乙個io的read或者write沒有得到資料的時候,會一直等待,當前執行緒不能做其他
的事情。而nio提供了非阻塞方式,它可以在沒有資料到來之前,先做其他的事情,資料到來之後進行處理。
3)nio提供了選擇器selector,通過它允許乙個執行緒監視多個通道,避免了申請多個執行緒浪費資源以及執行緒
間的頻繁切換,以此提高了資源的利用率。
channel、buffer、selector
channel表示通道,通道的一端連線buffer,另一端連線需要被操作的資源(假設資源是檔案檔案)。它
相當於一根管子,buffer中的資料可以通過管子寫入被操作的資源當中,也可以將資源通過管子寫入到buffer中去。
常用的channel有:
filechannel
datagramchannel
socketchannel
serversocketchannel
其中filechannel是阻塞的,其他的可以設定成非阻塞的。
buffer:表示緩衝區,本質是乙個可以讀寫的記憶體空間,channel中的資料從資源流向buffer或者從buffer
流向資源,緩衝區有四個重要的字段,讀取寫入緩衝區的時候,都是操作這幾個字段實現的:
capacity:記憶體塊可以讀入的大小。
position:當前指向的位置,每讀取乙個位元組後,它都會向後移動乙個位置
當前position位置
mark:標定的乙個特定的位置,標定好後可以使用reset方法回到這個位置。
nio中,資源的讀寫操作都是通過buffer實現的。
常用的buffer有:
bytebuffer
charbuffer
doublebuffer
floatbuffer
intbuffer
longbuffer
shortbuffer
selector:nio中最重要的一部分,乙個selector可以管理多個channel,當selecot管
理的channel沒有準備好的時候,selecot就阻塞,當有channel準備好需要操作的時候,
selecot就被喚醒。傳統的io方式下,如果有多個請求到來,一般會開闢多個執行緒來處理這些
請求,如果請求的資源沒有準備好,那麼執行緒就會處於阻塞狀態,極大的浪費了資源。而nio採
用多路復用的技術,當有請求到來的時候,先註冊到selector中,當註冊到selector中感興
趣的請求資源準備好後,才會進行處理,(注意:註冊的channel必須是同步非阻塞的)避免了
傳統io中開闢的多個執行緒阻塞占用資源的問題。當你的每個通道的資料傳輸量比較低的時候,使
用它會非常合適。
ps:selector中底層設計中涉及io多路復用,同步非阻塞知識,不懂的話先瞅瞅它們。
@test
public
void
test1() throws ioexception
bytebuffer.clear();//清空緩衝區
}randomaccessfile.close();
}
學習NIO小結
nio 同步非阻塞 在jdk1.4時推出,和傳統的io 同步阻塞 比較有著新的思想,在網上學習和整理知識點時知道學習nio可分為3個部分 1.channel 通道,資料的讀取和寫入都可以通過它來完成。2.selector 選擇器,用於選擇註冊在通道中的已發生的事件。3.bytebuffer 乙個新的...
NIO學習總結
使用傳統的i o讀取檔案內容 param filepath 檔案路徑 throws ioexception public static void ioread string filepath throws ioexception 使用nio讀取檔案內容 param filepath 檔案路徑 thr...
NIO學習 一 java nio介紹
如果有一組客戶端,需要連線到乙個服務端,如果使用i o操作,乙個客戶端連線上,其他客戶端需要阻塞等待,或者採用每個客戶端請求,建立乙個執行緒的方式,這樣很耗費資源,nio提供了方法能夠輪詢一組客戶端 channel 通道 乙個channel代表了乙個可操作的i o目標,比如套接字 buffer 緩衝...