Java NIO中的非阻塞伺服器
非阻塞伺服器
Java NIO(新輸入/輸出)是一個非常強大的網路和檔案處理應用程式,可以用作 Java 標準 IO API 的替代方案。由於自 JDK 4 引入以來添加了更多高階功能,它已迅速成為眾多工程師的首選 I/O 系統。
它提供改進的檔案處理和檔案系統功能支援是其區別於其他功能之一。由於 NIO 檔案類具有如此強大的功能,因此它被廣泛用於檔案處理。
仔細觀察,您會注意到 java.nio 包指定了 NIO API 始終使用的緩衝區類。最棒的是,它是為了讓 Java 程式設計師能夠實現快速 I/O 而無需編寫其本機程式碼而建立的。
阻塞與非阻塞 I/O
由於使用了非阻塞 I/O,非阻塞伺服器可以透過同一個程序或執行緒同時處理多個請求。將阻塞程序視為售票處排隊,其中每個客戶都必須等待前面的人員服務完畢才能繼續。
相反,非阻塞程序就像餐廳的服務員,試圖透過輪流為所有顧客服務並處理他們的訂單來同時為所有顧客服務。
阻塞伺服器以同步方式工作,並在繼續下一個請求之前完成每個請求。這可能導致客戶端等待時間更長,並且需要多個執行緒來服務每個請求,從而使其成為 CPU 密集型操作。另一方面,非阻塞伺服器使用非同步方法,允許一個執行緒同時處理多個查詢,並在每個請求完成後做出響應。
Java NIO 的功能
Java NIO 有一些獨特的特性,使其有別於其他 IO 系統。以下是 Java NIO 主要功能的概述:
非同步和非阻塞 IO − 此功能允許執行緒在資料讀取到緩衝區時執行其他任務。執行緒無需等待資料完全載入才能開始處理,而可以在讀取資料時繼續其工作。
面向緩衝區的方法 − Java NIO 將資料儲存在緩衝區中,這允許快速訪問和處理。當需要資料時,它將從緩衝區中檢索和處理。
演算法
步驟 1 − 首先,我們必須使用 import 語句匯入必要的類。
步驟 2 − 接下來,我們需要建立一個名為“WriteExample2”的公共類。
步驟 3 − 在此類中,我們必須定義一個接受 String 型別變數引數的公共靜態 void main 函式。
步驟 4 − 現在,使用 Files.createTempFile() 方法建立一個副檔名為“.txt”的臨時檔案。要寫入,我們可以使用 Files.write() 方法以及儲存字串“Hello”和“world”的可迭代物件。
步驟 5 − 要讀取 Files' createTempFile() 函式返回的 Path 物件定義的檔案中的每個位元組,我們可以使用 Files.readAllBytes() 函式。之後,我們需要使用新的 String() 建構函式將其轉換為字串。
步驟 6 − 最後,使用 System.out.println() 方法將字串列印到控制檯。
示例 1
此 Java 程式碼建立一個臨時文字檔案,並將“Hello”和“world”寫入其中。然後讀取檔案並列印其內容。該程式碼使用 Java NIO 包中的 Files 類來處理檔案操作。
package com.tutorialspoint.example.files;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
public class WriteExample2 {
public static void main(String... args) throws IOException {
Path path = Files.createTempFile("test-file", ".txt");
Iterable<String> iterable = Arrays.asList("Hello", "world");
Files.write(path, iterable);
byte[] bytes = Files.readAllBytes(path);
System.out.println(new String(bytes));
}
}
輸出
Hello world
Java NIO 的元件
Java NIO 建立在三個基本元件之上:緩衝區、通道和選擇器。以下是每個元件的簡要概述:
緩衝區 − 緩衝區是一塊記憶體塊,用於在資料從一個位置傳輸到另一個位置時臨時儲存資料。在 Java NIO 中,緩衝區用於促進資料的讀取和寫入。
通道 − Java NIO 中的通道表示與可以執行 IO 操作的物件的連線,例如檔案和套接字。通道負責在緩衝區與其表示的物件之間傳輸資料。
選擇器 − 選擇器是 Java NIO 元件,用於監視一個或多個通道的事件,例如準備好執行 I/O 操作。當通道準備就緒時,選擇器可以喚醒並允許相應的執行緒處理該操作。
非阻塞伺服器組成
非阻塞伺服器由非阻塞 IO 管道組成,該管道是一系列元件,以非阻塞方式處理讀寫 IO 操作。以下是此管道的工作原理:
管道中的每個元件都使用選擇器來確定通道是否有資料要讀取。
如果有資料,元件會讀取它並根據它提供輸出。之後,輸出將寫回通道。
根據元件的不同,非阻塞 IO 管道可以讀取和寫入資料,以及執行這兩種操作。
元件透過選擇器開始從通道讀取資料。Java NIO 管理非阻塞 IO 操作,而選擇器和選擇鍵與可選擇通道一起定義多路複用 IO 操作。
非阻塞 IO 管道將資料劃分為邏輯上排序或組合的訊息以及非阻塞資料處理。這類似於使用 Java 的 StreamTokenizer 類對資料流進行標記,然後再進行處理。
與阻塞 IO 管道(使用類似於 InputStream 的介面並且一次只允許讀取一個位元組)不同,非阻塞模型使用 Java NIO 選擇器來檢查並僅提供確實有資料要讀取的 SelectableChannel 例項。
伺服器讀寫操作的阻塞和非阻塞模型比較
在伺服器架構的世界中,選擇使用阻塞或非阻塞模型進行讀寫操作會極大地影響伺服器的效率和可擴充套件性。
與阻塞模型相反,非阻塞模型允許程序透過交錯非阻塞 I/O 呼叫來適應多個併發請求。
為了說明這些模型之間的區別,讓我們考慮一個假設的伺服器,該伺服器接收兩個請求。在阻塞模型中,程序必須等待請求 A 完全處理完畢才能繼續處理請求 B。相反,非阻塞模型可以透過交錯處理請求 A 和 B 來同時處理這兩個請求。
Java NIO 使單個執行緒能夠控制多個通道,從而支援非阻塞 I/O。
連線緩衝區和另一端物件的通道使非同步資料傳輸成為可能。SocketChannel 和 ServerSocketChannel 兩個類實現了 Java NIO 通道,並使透過 TCP 連線接收和寫入資料成為可能。
伺服器架構師可以透過選擇合適的 I/O 模型來建立高效、可擴充套件的系統,並且能夠管理大量併發請求。
結論
Java NIO 提供了一個強大的網路和檔案處理應用程式,並改進了對檔案處理和檔案系統功能的支援。其非同步和非阻塞 I/O、面向緩衝區的方法以及緩衝區、通道和選擇器三個基本元件使其成為一個獨特的 I/O 系統。
Java NIO 的非阻塞伺服器模型能夠透過使用非阻塞 I/O 管道同時處理多個請求。與阻塞 IO 管道不同,非阻塞模型檢查並僅提供確實有資料要讀取的 SelectableChannel 例項,使其成為更快、更高效的系統。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP