NIO與IO的異同


1. 面向流與面向緩沖

標准的IO基於字節流和字符流進行操作的,而NIO是基於通道(Channel)和緩沖區(Buffer)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。

Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩沖區的。 JavaIO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前后移動流中的數據。如果需要前后移動從流中讀取的數據,需要先將它緩存到一個緩沖區。 Java NIO的緩沖導向方法略有不同。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區里尚未處理的數據。

2. 阻塞與非阻塞

Java NIO可以讓你異步的使用IO,例如:當線程從通道讀取數據到緩沖區時,線程還是可以進行其他事情。當數據被寫入到緩沖區時,線程可以繼續處理它。從緩沖區寫入通道也類似。

Java IO的各種流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。

3. 選擇器

Java NIO引入了選擇器的概念,選擇器用於監聽多個通道的事件(比如:連接打開,數據到達)。因此,單個的線程可以監聽多個數據通道。

Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已准備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道

NIO:如果需要管理同時打開的成千上萬個連接,這些連接每次只是發送少量的數據,采用NIO.例如一個聊天服務器,用NIO實現會更好一些,相似的,如果你需要保持很多個到其他電腦的連接,例如P2P網絡,用一個單獨的線程來管理所有出口連接是比較合適的

IO: 如果需要管理同時打開不太多的連接,這些連接會發送大量的數據

4. Java NIO 由以下幾個核心部分組成: 

Channels通道(讀寫)

Buffers緩沖

Selectors選擇器(管理通道)

基本上,所有的 IO 在NIO中都從一個Channel 開始。Channel 有點象流。數據可以從Channel讀到Buffer中,也可以從Buffer 寫到Channel中。

5. 在java中使用io、nio、aio

io最老
nio是1.4的特性
aio是1.7的特性
io是面向流的,是就用多少拿多少。是阻塞的。數據量不大的或者不在意阻塞的時可以用。
nio是面向塊的,先把數據搬過來,先存到緩存區里面,如果線程要用從緩存區拿。所以線程不需要時刻盯着io了,可以先做一些其他的事情,過幾天再來看一下緩存。是同步非阻塞的。因此,nio里有Buffer類作為緩沖區,Channel(通道)相當於io里的steam的抽象,Selector是nio提供的管理多個Channel的工具。nio出現也是因為io漸漸成為一些程序速度的瓶頸。
aio加了一個異步的特性。當我們要拿數據花費時間太長的時候,我們可以考慮使用異步的io。異步就是可以理解為,讓io先處理者,我線程先去干別的事情了,你io處理完了通知我一下。aio提供的事件處理接口CompletionHandler,定義了回調函數,這些函數再io完成后會被自動的調用。



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



IO、文件、NIO【草案二】 java IO 之網絡 NIO java 的nio與io對比 IO及NIO的總結 Java NIO與IO的區別 Java的NIO及與IO區別 Java NIO與IO的區別 Java IO 和 NIO的區別 五.Java IO、NIO、文件、通訊 IO編程和NIO編程簡介
 
粤ICP备14056181号  © 2014-2020 ITdaan.com