Java NIO與IO的區別和比較
阿新 • • 發佈:2018-01-09
選擇器 獲取 如果 得到 提供服務 單獨 每次 取數 details 現代的酒店服務方式跟傳統的區別有兩個:
1、增加了一個角色,要有一個專門負責收集客人需求的人。NIO裏對應的就是Selector。
2、由阻塞服務方式改為非阻塞服務了,客人吃著的時候服務員不用一直侯在客人旁邊了。傳統的IO操作,比如read(),當沒有數據可讀的時候,線程一直阻塞被占用,直到數據到來。NIO中沒有數據可讀時,read()會立即返回0,線程不會阻塞。
NIO中,客戶端創建一個連接後,先要將連接註冊到Selector,相當於客人進入餐廳後,告訴前臺你要用餐,前臺會告訴你你的桌號是幾號,然後你就可能到那張桌子坐下了,SelectionKey就是桌號。當某一桌需要服務時,前臺就記錄哪一桌需要什麽服務,比如1號桌要點菜,2號桌要結帳,服務員從前臺取一條記錄,根據記錄提供服務,完了再來取下一條。這樣服務的時間就被最有效的利用起來了。
Selectors(選擇器):Java NIO引入了選擇器的概念,選擇器用於監聽多個通道的事件(比如:連接打開,數據到達)。因此,單個的線程可以監聽多個數據通道。
1、增加了一個角色,要有一個專門負責收集客人需求的人。NIO裏對應的就是Selector。
2、由阻塞服務方式改為非阻塞服務了,客人吃著的時候服務員不用一直侯在客人旁邊了。傳統的IO操作,比如read(),當沒有數據可讀的時候,線程一直阻塞被占用,直到數據到來。NIO中沒有數據可讀時,read()會立即返回0,線程不會阻塞。
NIO中,客戶端創建一個連接後,先要將連接註冊到Selector,相當於客人進入餐廳後,告訴前臺你要用餐,前臺會告訴你你的桌號是幾號,然後你就可能到那張桌子坐下了,SelectionKey就是桌號。當某一桌需要服務時,前臺就記錄哪一桌需要什麽服務,比如1號桌要點菜,2號桌要結帳,服務員從前臺取一條記錄,根據記錄提供服務,完了再來取下一條。這樣服務的時間就被最有效的利用起來了。
區別:
IO NIO
面向流 面向緩沖
阻塞IO 非阻塞IO
無 選擇器
Java NIO提供了與標準IO不同的IO工作方式:
Channels and Buffers(通道和緩沖區):標準的IO基於字節流和字符流進行操作的,而NIO是基於通道(Channel)和緩沖區(Buffer)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。
Asynchronous IO(異步IO):Java NIO可以讓你異步的使用IO,例如:當線程從通道讀取數據到緩沖區時,線程還是可以進行其他事情。當數據被寫入到緩沖區時,線程可以繼續處理它。從緩沖區寫入通道也類似。
使用場景:
NIO的優勢:
1.優勢在於一個線程管理多個通道;但是數據的處理將會變得復雜;
2.如果需要管理同時打開的成千上萬個連接,這些連接每次只是發送少量的數據,采用這種;
傳統IO的優勢:
1.適用於一個線程管理一個通道的情況;因為其中的流數據的讀取是阻塞的;
2.如果需要管理同時打開不太多的連接,這些連接會發送大量的數據;
區別:
NIO vs IO之間的理念上面的區別(NIO將阻塞交給了後臺線程執行):
IO是面向流的,NIO是面向緩沖區的 Java IO面向流意味著每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方; NIO則能前後移動流中的數據,因為是面向緩沖區的 IO流是阻塞的,NIO流是不阻塞的 Java IO的各種流是阻塞的。這意味著,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再幹任何事情了 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麽都不會獲取。NIO可讓您只使用一個(或幾個)單線程管理多個通道(網絡連接或文件),但付出的代價是解析數據可能會比從一個阻塞流中讀取數據更復雜。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 選擇器 Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道裏已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。 *參考博客分析:* *http://blog.csdn.net/evanman/article/details/50910542 https://www.cnblogs.com/kzfy/p/5063467.html*
Java NIO與IO的區別和比較