NIO(1、概述)

離上次發佈文章已過去好幾個月,說好的積累和分享都煙消雲散。彷佛忙碌從未終止過,加班成爲常態,甚至閱讀都須要更瑣碎的時間。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)模式,把這些概念清晰明白的說出來並不是一日之功。優化

與IO有何區別

這是某文件的一段文本線程

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

組成部分

  • Channels
  • Buffers
  • Selectors

  NIO API最核心就是這三個部分,Channels意指通道,數據從通道(Channel)開始,流入緩衝區(Buffer),或者從緩衝區流入通道,選擇器(Selector)存在的意義即是監聽多個通道的事件,讓線程處理。

(未完待續!)

相關文章
相關標籤/搜索