【Java面試】IO和NIO有什麼區別?

跟著Mic學架構 發表於 2022-06-02
Java 面試

IO問題一直是面試的重災區之一

但又是非常重要而且面試必問的知識點

一個工作了7年的粉絲私信我,他去面試了 4家網際網路公司,

有三個公司問他網路IO的問題,另外一個公司問了Netty,結果都沒回答上來。

好吧,對於“IO和NIO的區別”,看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。

高手:

好的,關於這個問題,我會從下面幾個方面來回答。

首先,I/O ,指的是IO流, 它可以實現資料從磁碟中的讀取以及寫入。

實際上,除了磁碟以外,記憶體、網路都可以作為I/O流的資料來源和目的地。

在Java裡面,提供了字元流和位元組流兩種方式來實現資料流的操作。

其次,當程式是面向網路進行資料的IO操作的時候,Java裡面提供了Socket的方式來實現。

通過這種方式可以實現資料的網路傳輸。

基於Socket的IO通訊,它是屬於阻塞式IO,也就是說,在連線以及IO事件未就緒的情況下,當前的連線會處於阻塞等待的狀態。

image-20220422210331160

如果一旦某個連線處於阻塞狀態,那麼後續的連線都得等待。所以服務端能夠處理的連線數量非常有限。

NIO,是JDK1.4裡面新增的一種NEW IO機制,相比於傳統的IO,NIO在效率上做了很大的優化,並且新增了幾個核心元件。

Channel、Buffer、Selectors。

另外,還提供了非阻塞的特性,所以,對於網路IO來說,NIO通常也稱為No-Block IO,非阻塞IO。

也就是說,通過NIO進行網路資料傳輸的時候,如果連線未就緒或者IO事件未就緒的情況下,服務端不會阻塞當前連線,而是繼續去輪詢後續的連線來處理。

所以在NIO裡面,服務端能夠並行處理的連結數量更多。

image-20220422212223083

因此,總的來說,IO和NIO的區別,站在網路IO的視角來說,前者是阻塞IO,後者是非阻塞IO。

以上就是我對這個問題的理解。

總結

在網際網路時代,網路IO是最基礎的技術。

無論是微服務架構中的服務通訊、還是應用系統和中介軟體之間的網路通訊,都在體現網路IO的重要性。

如果想獲得一對一的面試指導以及面試資料,可以私信我。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!

相關文章