1、標準I/O
InputStream和OutputStream作用于字節(jié)流,Reader和Writer作用于字符流。

JDK1.4引入新的I/O類庫,舊的I/O包已經(jīng)使用nio重新實現(xiàn)過,以便充分利用這種速度提高。
通道和緩存。我們可以把它相像成一個煤礦,通道是一個包含煤礦(數(shù)據(jù))的礦藏,而緩沖器則是派送到礦藏的卡車。也就是說,我們并不是直接和通道交互,而只與緩沖交互,并把緩沖派到通道,獲取數(shù)據(jù)或發(fā)送數(shù)據(jù)。


2、BIO
bio即block-I/O,同步阻塞式I/O

由代碼可知,在while循環(huán)內(nèi)服務端會調(diào)用accept方法等待接收客戶端的連接請求,一旦一個請求連接,就可以建立通信套接字在這個通信套接字上進行讀寫操作,此時不能再接收其他客戶端連接請求,只能等待同當前連接的客戶端的操作執(zhí)行完成,再進行下一次循環(huán)。此處可以使用線程池技術(shù),提高并發(fā),但隨著連接的增多,將會消耗過多的內(nèi)存資源,導致服務器變慢甚至崩潰。
3、NIO
nio即no-block I/O,同步非阻塞式IO

init操作是獲取一個serverSocketChanel并注冊到selector


run方法實際是對selector做遍歷,監(jiān)聽事件(SelectionKey 有isReadable()、isWritable()、isConnectable()、isAcceptable())并處理。利用buffer作為程序與I/O的緩沖提高運行速度。
NIO較BIO的優(yōu)勢,通過selector輪詢channel,選擇就緒事件處理。當存在大量客戶端連接請求時,服務器處理事件可以得到有效調(diào)控。
①客戶端發(fā)起的連接請求是異步的,可以通過直接在多路復用器注冊O(shè)P_CONNECT操作等待后續(xù)操作,不需要同步阻塞等待結(jié)果可用。
②SocketChannel的讀寫都是異步的,如果沒有可讀寫的數(shù)據(jù)它不會同步等待,直接返回,這樣IO通信線程可以處理其他鏈路,不要同步等待這個鏈路可用。
③線程模型的優(yōu)化:由于JDK的Selector在Linux等主流OS中通過epoll實現(xiàn),沒有連接句柄數(shù)的限制,這意味著Selector線程可以同時處理成千上萬的客戶端連接,而且性能不會隨著客戶端的增加而線性下降,因此非常適合做高性能、高并發(fā)的網(wǎng)絡(luò)服務器。
陳釗對這個過程在java bio,nio,aio及源碼中講解得還是比較清晰的。
參考:
1、《Java編程思想》