1. 程式人生 > 其它 >BIO和NIO的區別

BIO和NIO的區別

1.BIO基本介紹

  • BIO是傳統的Java IO程式設計,其基本的類和介面在java.io包中
  • BIO(blocking I/O):同步阻塞,伺服器實現模式為一個連線一個執行緒,即客戶端有連線請求時伺服器端就需要啟動一個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷
  • BIO方式使用於連線數目比較小且固定的架構,這種服務方式對伺服器資源要求比價高,並且侷限於應用中,JDK1.4以前的唯一選擇,程式簡單易理解

2.NIO基本介紹

  • NIO全稱 java non-blocking IO。從JDK 1.4開始,java提供了一些列改進的輸入/輸出(I/O)的新特性,被稱為NIO,是同步非阻塞的
  • NIO相關類都被放在java.nio包及其子包下
  • NIO三大核心部分:Channel(通道),Buffer(緩衝區),Selector(選擇器)
  • NIO是面向緩衝區的,或者面向塊程式設計的。資料讀取到一個它稍後處理的緩衝區,需要時可在緩衝區內前後移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞的高伸縮性網路
  • Java NIO的非阻塞模式,使一個執行緒從某通道傳送或者讀取資料,但是它僅能得到目前可用的資料,如果目前沒有可用的資料時,就什麼都不會獲取,而不是保持執行緒阻塞,所以直至資料變的可讀取之前,該執行緒可以繼續做其他事情。非阻塞就是如此,一個執行緒請求寫入一些資料到某通道,但不需要等待它完全寫入,這個執行緒同時可以去做別的事情
  • 通俗來講:NIO是可以做到用一個執行緒處理多個操作的。假設有10000個請求過來,根據實際情況,可以分配50或100個執行緒來處理。不想BIO一樣需要分配10000個執行緒來處理

3.BIO和NIO的區別

  • BIO以流的方式處理資料,NIO以塊的方式處理資料,塊IO的效率比流IO高很多。(比如說流IO他是一個流,你必須時刻去接著他,不然一些流就會丟失造成資料丟失,所以處理這個請求的執行緒就阻塞了他無法去處理別的請求,他必須時刻盯著這個請求防止資料丟失。而塊IO就不一樣了,執行緒可以等他的資料全部寫入到緩衝區中形成一個數據塊然後再去處理他,在這期間該執行緒可以去處理其他請求)
  • BIO是阻塞的,NIO是非阻塞的
  • BIO基於位元組流和字元流進行操作的,而NIO基於Channel(通道)和Buffer(緩衝區)進行操作的,資料總是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中。Selector(選擇器)用於監聽多個通道事件,因此使用單個執行緒就可以監聽多個客戶端通道