1. 程式人生 > 實用技巧 >NIO的特性/NIO與IO區別

NIO的特性/NIO與IO區別

NIO的特性/NIO與IO區別

如果是在面試中回答這個問題,我覺得首先肯定要從 NIO 流是非阻塞 IO 而 IO 流是阻塞 IO 說起。然後,可以從 NIO 的3個核心元件/特性為 NIO 帶來的一些改進來分析。如果,你把這些都回答上了我覺得你對於 NIO 就有了更為深入一點的認識,面試官問到你這個問題,你也能很輕鬆的回答上來了。

1)Non-blocking IO(非阻塞IO)

IO流是阻塞的,NIO流是不阻塞的。

Java NIO使我們可以進行非阻塞IO操作。比如說,單執行緒中從通道讀取資料到buffer,同時可以繼續做別的事情,當資料讀取到buffer中後,執行緒再繼續處理資料。寫資料也是一樣的。另外,非阻塞寫也是如此。一個執行緒請求寫入一些資料到某通道,但不需要等待它完全寫入,這個執行緒同時可以去做別的事情。

Java IO的各種流是阻塞的。這意味著,當一個執行緒呼叫read()write()時,該執行緒被阻塞,直到有一些資料被讀取,或資料完全寫入。該執行緒在此期間不能再幹任何事情了

2)Buffer(緩衝區)

IO 面向流(Stream oriented),而 NIO 面向緩衝區(Buffer oriented)。

Buffer是一個物件,它包含一些要寫入或者要讀出的資料。在NIO類庫中加入Buffer物件,體現了新庫與原I/O的一個重要區別。在面向流的I/O中·可以將資料直接寫入或者將資料直接讀到 Stream 物件中。雖然 Stream 中也有 Buffer 開頭的擴充套件類,但只是流的包裝類,還是從流讀到緩衝區,而 NIO 卻是直接讀到 Buffer 中進行操作。

在NIO厙中,所有資料都是用緩衝區處理的。在讀取資料時,它是直接讀到緩衝區中的; 在寫入資料時,寫入到緩衝區中。任何時候訪問NIO中的資料,都是通過緩衝區進行操作。

最常用的緩衝區是 ByteBuffer,一個 ByteBuffer 提供了一組功能用於操作 byte 陣列。除了ByteBuffer,還有其他的一些緩衝區,事實上,每一種Java基本型別(除了Boolean型別)都對應有一種緩衝區。

3)Channel (通道)

NIO 通過Channel(通道) 進行讀寫。

通道是雙向的,可讀也可寫,而流的讀寫是單向的。無論讀寫,通道只能和Buffer互動。因為 Buffer,通道可以非同步地讀寫。

4)Selector (選擇器)

NIO有選擇器,而IO沒有。

選擇器用於使用單個執行緒處理多個通道。因此,它需要較少的執行緒來處理這些通道。執行緒之間的切換對於作業系統來說是昂貴的。 因此,為了提高系統效率選擇器是有用的。

原文地址:https://snailclimb.gitee.io/javaguide/#/docs/java/basis/BIO,NIO,AIO%E6%80%BB%E7%BB%93?id=_22-nio%e7%9a%84%e7%89%b9%e6%80%a7nio%e4%b8%8eio%e5%8c%ba%e5%88%ab