離上次發佈文章已過去好幾個月,說好的積累和分享都煙消雲散。彷佛忙碌從未終止過,加班成爲常態,甚至閱讀都須要更瑣碎的時間。html
NIO(1、概述)
NIO(2、Buffer)
NIO(3、Channel)
NIO(4、Selector)java
JavaNIO(new IO),1.4版本引入的新的IO API。從表現來看,NIO優化了更多的應用場景。在1.7版本NIO作了一次升級,引入了更多的特性,例如AIO異步
提及NIO,彷佛有不少相關的概念,諸如同步(/異步)阻塞(/非阻塞),Reactor(/Proactor)模式,把這些概念清晰明白的說出來並不是一日之功。優化
這是某文件的一段文本線程
Hello World
簡單的IO操做就像下面這樣:code
InputStream input = new FileInputStream(dir); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String line1 = reader.readLine(); //"Hello" String line2 = reader.readLine(); //"World"
那麼NIO操做簡單事例:htm
FileInputStream fis = new FileInputStream(dir); //建立通道 FileChannel channel = fis.getChannel(); //分配緩衝區 ByteBuffer buffer = ByteBuffer.allocate(1024); channel.read(buffer); String txt = Charset.forName("utf-8").newDecoder().decode(buffer).toString();
能夠確定的是,兩種工做方式並不一樣。
比較上面兩份代碼,咱們會發現,IO的操做是直接操做流的,而NIO倒是操做緩衝區,相比較操做流,操做緩衝區將會更加自由靈活。
此外,須要注意的是,使用Java IO時,當執行 reader.readLine() 時候,意味着當前的線程呈阻塞狀態,直到該行讀取結束。blog
顯然,NIO的選擇器容許單獨的線程來管理多個通道,盡力利用一個線程的資源處理多個鏈接,這就是多路複用。由於這個機制,線程在空閒的狀態下,不會由於某個通道等待而阻塞另外一個通道。固然,NIO一樣也提供了Asynchronous IO(異步IO),不論數據從通道到緩衝區仍是緩衝區到通道,任何一個空閒的時候,線程均可以作其餘事情。事件
那麼何時使用NIO呢?作一個比喻,假如線程是一個水桶的話,你去一個水龍頭接水,那麼此時你能夠使用Java IO,但若是水龍頭的水時有時無不說,水流還小,那麼你可能會用這個水桶同時接多個水龍頭,那麼這時候,你使用的就應該是Java NIO。utf-8
NIO API最核心就是這三個部分,Channels意指通道,數據從通道(Channel)開始,流入緩衝區(Buffer),或者從緩衝區流入通道,選擇器(Selector)存在的意義即是監聽多個通道的事件,讓線程處理。
(未完待續!)