Java IO與NIO比較


在學習NIO之前,有必要將它與Java IO進行比較,以了解兩個包之間的差別。

下面表格列出了Java IO和NIO之間的主要區別:

IO NIO
基於阻塞I/O操作 基於非阻塞I/O操作
面向流的 面向快取的
通道不可用 通道可用於非阻塞I/O操作
選擇器不可用 選擇器可用於非阻塞I/O操作

阻塞與非阻塞I/O

阻塞I/O

阻塞IO等待資料寫入或返回前的讀取。Java IO的各種流是阻塞的。這意味著當執行緒呼叫write()read()時,執行緒會被阻塞,直到有一些資料可用於讀取或資料被完全寫入。

非阻塞I/O

非阻塞IO不等待返回前讀取或寫入資料。 Java NIO非阻塞模式允許執行緒請求向通道寫入資料,但不等待它被完全寫入。允許執行緒繼續進行,並做其他事情。

面向流與面向緩衝

面向流

Java IO是面向流的I/O,這意味著我們需要從流中讀取一個或多個位元組。它使用流來在資料源/槽和java程式之間傳輸資料。使用此方法的I/O操作較慢。

下面來看看在Java程式中使用輸入/輸出流的資料流圖:

面向緩衝

Java NIO是面向快取的I/O方法。 將資料讀入緩衝器,使用通道進一步處理資料。 在NIO中,使用通道和緩衝區來處理I/O操作。

通道和流之間的主要區別是:

  • 流可以用於單向資料傳輸。
  • 通道提供雙向資料傳輸。

因此,通過在java NIO中引入通道,可以執行非阻塞I/O操作。

下面看看通道,緩衝區,java程式,資料源和資料接收器之間的相互作用 -

通道(Channels)

在Java NIO中,通道是在實體和位元組緩衝區之間有效傳輸資料的媒介。 它從一個實體讀取資料,並將其放在緩衝區塊中以供消費。

通道作為Java NIO提供的閘道器來存取I/O機制。通常,通道與作業系統檔案描述符具有一對一關係,用於提供平台獨立操作功能。

NIO通道基礎

通道使用原生代碼執行實際工作。通道介面允許我們以便攜和受控的方式存取低階I/O服務。

在層次結構的頂部,通道介面如下所示:

package java.nio.channels;  
 public interface Channel{  
    public boolean isclose();  
    public void Open() throws IOException;  
}

正如在上述通道介面中看到的,所有通道中有常見的兩個操作:

  • 檢查通道是否關閉(isclose())
  • 開啟關閉通道(close())

選擇器(Selectors)

在Java NIO中,選擇器是可選擇通道的多路複用器,可用作可以進入非阻塞模式的特殊型別的通道。它可以檢查一個或多個NIO通道,並確定哪個通道準備好進行通訊,即讀取或寫入。

選擇器(Selectors)的用途是什麼?

選擇器用於使用單個執行緒處理多個通道。因此,它需要較少的執行緒來處理這些通道。

執行緒之間的切換對於作業系統來說是昂貴的。 因此,為了提高系統效率選擇器是有用的。

下面來看看使用選擇器來處理3個通道的執行緒的示意圖:

建立選擇器

可以通過呼叫Selector.open()方法建立一個選擇器,如下程式碼所示:

Selector selector = Selector.open();