Java NIO(Java New IO)是傳統(tǒng)IO的一種替代,它是在Java 1.4引進(jìn)的,它可以代替?zhèn)鹘y(tǒng)的IO和Java 網(wǎng)絡(luò)編程的API.Java NIO提供了一種以傳統(tǒng)IO不同的工作方式。
Java NIO:Channels and Buffers(通道和緩沖區(qū))
傳統(tǒng)的Java IO API主要用來處理字節(jié)流和字符流。在NIO中,你主要面向channels和buffers。數(shù)據(jù)是從channel讀入到buffer,或者從buffer寫出到channel。
Java NIO:NON-blocking IO(非阻塞式IO)
Java NIO是是非阻塞的IO,例如,一個(gè)線程正在從一個(gè)channel讀入數(shù)據(jù)到buffer,這個(gè)時(shí)候channel數(shù)據(jù)若是還沒準(zhǔn)備好,那么這個(gè)線程可以去處理其他事情。一旦channel準(zhǔn)備好了數(shù)據(jù),那么線程就可以繼續(xù)讀入數(shù)據(jù)到buffer。從buffer寫出數(shù)據(jù)到channel也是同理。
Java NIO:Selectors
Java NIO 包含選擇器這個(gè)概念。選擇器能夠監(jiān)控多個(gè)channel的事件(例如:連接打開,數(shù)據(jù)到達(dá)等)。因此,一個(gè)線程就能過管理多個(gè)channel的數(shù)據(jù)。
IO VS NIO
傳統(tǒng)的IO是阻塞式,你調(diào)用read()方法,必須等對(duì)方給你返回?cái)?shù)據(jù)你才可以干別的。只要對(duì)方不給你返回?cái)?shù)據(jù),你的線程就只能在那里干等著。
而NIO就是為了解決這個(gè)問題而設(shè)計(jì)的,它通過設(shè)計(jì)的Buffers,Channels和Selectors類來解決數(shù)據(jù)沒準(zhǔn)備好線程干等的問題。
這里舉個(gè)醫(yī)院里邊的一個(gè)例子來描述一下Java IO和Java NIO。
傳統(tǒng)的IO就好像早期醫(yī)院掛點(diǎn)滴,病人的點(diǎn)滴快完了,護(hù)士就得在邊上等,等病人的點(diǎn)滴完了后給換新的或者拔針。這個(gè)時(shí)候一個(gè)護(hù)士就只能等在這個(gè)病人的床邊,只能管理到一個(gè)病人。
NIO就像改進(jìn)后的醫(yī)院,在病人的床邊裝了告警鈴,這個(gè)時(shí)候病人點(diǎn)滴快掛完了,護(hù)士也不用干等著,可以去干其他事情(給其他病人換藥水等等......),只有等病人藥水掛完了按一下告警鈴,護(hù)士聽到就過來給換一下就好了。這樣就一個(gè)護(hù)士就可以管理很多病人了。
要真正理解NIO就需要帶這幾個(gè)問題思考:
- Java NIO為什么會(huì)出現(xiàn)?
- Java NIO要怎么使用?
- 什么時(shí)候使用傳統(tǒng)IO,什么時(shí)候使用NIO?