java.nio.channels定義了各種通道,這些通道表示到能夠執行 I/O 操作的實體(如檔案和套接字)的連線;定義了用於多路復用的、非阻塞 I/O 操作的選擇器。
基本介紹
- 外文名:java.nio.channels
- 定義的通道:ReadableByteChannel等
- 通道作用: I/O 操作連線,讀入緩衝區等
- 通道定義:表示到實體的開放連線
通道描述,通道定義,檔案通道,多路復用,
通道描述
Channel 用於 I/O 操作的連線
ReadableByteChannel 可以將內容讀入緩衝區
ScatteringByteChannel 可以將內容讀入緩衝區序列
WritableByteChannel 可以從緩衝區中寫入內容
GatheringByteChannel 可以從緩衝區序列中寫入內容
ByteChannel 可以從緩衝區讀取內容或向其寫入內容
Channels 用於通道/流進行互操作的實用工具方法
通道定義
表示到實體(如硬體設備、檔案、網路套接字或者可以執行一個或多個諸如讀取或寫入之類的不同 I/O 操作的程式組件)的開放連線。正如在 Channel 接口中所指定的,通道可以處於打開或關閉狀態,並且它們既是可異步關閉的,又是可中斷的。
多個其他接口擴展了 Channel 接口,這些接口都指定了新的 I/O 操作。
ReadableByteChannel 接口指定了 read 方法,可將位元組從通道讀取到緩衝區;類似地,WritableByteChannel 接口指定了 write 方法,可將位元組從緩衝區寫入通道。ByteChannel 接口為可讀取和寫入位元組的常見通道統一了這兩個接口。
ScatteringByteChannel 和 GatheringByteChannel 接口分別擴展了 ReadableByteChannel 和 WritableByteChannel 接口,添加的 read 和 write 方法採用的是緩衝區序列,而不只是單個緩衝區。
Channels 實用工具類定義了各種靜態方法,這些方法支持 java io 包的流類和此包通道類的互操作。可根據 InputStream 或 OutputStream 構造合適的通道,反之可根據通道構造 InputStream 或 OutputStream。可構造 Reader 來使用給定的字元集對來自給定可讀取位元組通道的位元組進行解碼,反之可構造 Writer 來使用給定的字元集將字元編碼到位元組中,並將該位元組寫入給定的可寫入位元組通道。
檔案通道
描述
FileChannel 讀取、寫入、映射和操作檔案
FileLock 對檔案(檔案區域)的鎖定
MappedByteBuffer 映射到檔案區域的直接位元組緩衝區
FileChannel 類支持從連線到檔案的通道讀取位元組或向其寫入位元組,以及查詢和修改當前的檔案位置和將檔案截取為指定大小等常見操作。它定義了在整個檔案或具體檔案區域上獲取鎖定的方法;這些方法返回 FileLock 類的實例。最後,它定義了對要寫入到存儲設備的檔案進行強行更新的方法、在檔案和其他通道之間高效傳輸位元組的方法,以及將檔案區域直接映射到記憶體中的方法。最後一個操作創建 MappedByteBuffer 類的實例,該實例擴展了 ByteBuffer 類,具有多種檔案相關的操作。
已經向 java io 包的每個 FileInputStream、FileOutputStream 和 RandomAccessFile 類添加了 getChannel 方法。在這些類的某個類的實例上調用此方法將返回一個連線到基礎檔案的檔案通道。
多路復用
非阻塞 I/O
描述
SelectableChannel 可實現多路復用的通道
DatagramChannel java .net.DatagramSocket 通道
Pipe.SinkChannel 對管道的寫入結束
Pipe.SourceChannel 對管道的讀取結束
ServerSocketChannel java .net.ServerSocket 通道
SocketChannel java .net.Socket 通道
Selector 可選擇通道的多路復用器
SelectionKey 表示通道註冊到選擇器的標記
Pipe 形成單向管道的兩個通道
多路復用的非阻塞 I/O 比面向執行緒的阻塞 I/O 的可伸縮性更好,由選擇器、可選擇通道 和選擇鍵 提供。
選擇器 是可選擇通道 的多路復用器,它是可被置於非阻塞模式 的特殊類型的通道。要執行多路復用的 I/O 操作,首先要創建一個或多個可選擇通道、將其置於非阻塞模式,並將註冊 到選擇器註冊一個通道會指定一組由選擇器測試其是否準備就緒的 I/O 操作,並返回一個表示該註冊的選擇鍵。
一旦已經向選擇器註冊了通道,就可執行選擇操作 以發現哪些通道(如果有)已經準備好執行先前已聲明感興趣的一個或多個操作。如果某個通道已準備就緒,則將註冊時所返回的鍵添加到該選擇器的已選擇鍵集中。為了確定每個通道已準備好執行哪些操作,可以檢查該鍵集和其中的鍵。為了執行所需的任何 I/O 操作,可根據每個鍵檢索相應的通道。
指示其通道對某個操作已準備就緒的選擇鍵只是一個提示,並不保證執行緒執行此種操作而不導致被阻塞。為了在這些提示證明不正確時忽略這些提示,則要強制寫入負責執行多路復用 I/O 操作的代碼。
此包定義了與 java .net 包中定義的 DatagramSocket、ServerSocket 和 Socket 類相對應的可選擇通道類。為了支持與通道相關的套接字,已經對這些類進行了較小的更改。此包還定義了實現單向管道的簡單類。在所有情況下,都是通過調用相應類的靜態 open 方法來創建新的可選擇通道。如果某個通道需要一個關聯的套接字,則此操作同時也創建一個套接字。
可通過“插入”一個在 java.nio.channels.spi 包中定義的 SelectorProvider 類的替代定義或實例來替換選擇器、可選通道和選擇鍵的實現。並不期望很多開發人員都會實際使用這些設施;提供它的主要目的是為了在需要極高的性能時,能夠讓經驗豐富的用戶能充分利用特定於作業系統的 I/O 多路復用機制。
實現多路復用 I/O 抽象所要求的很多簿記和同步任務由 java.nio.channels.spi 包中的 AbstractInterruptibleChannel、AbstractSelectableChannel、AbstractSelectionKey 和 AbstractSelector 類來執行。在定義一個自定義的選擇器提供程式時,應該只直接擴展 AbstractSelector 和 AbstractSelectionKey 類;自定義通道類應該擴展此包中定義的適當 SelectableChannel 子類。
從以下版本開始:
1.4