【譯】Java NIO 簡明教程系列之 NIO 概述

coderlmm發表於2018-10-10

原文連線 Java NIO Overview

Java NIO 包含了一下核心元件。

  • Channels

  • Buffers

  • Selectors

Java NIO 中的類和元件遠遠多於這三個,在我看來 Channel, BufferSelector 構成了 API 的核心,其餘元件像 PipeFileLock 只不過是為了配合三個核心元件而結合使用的類罷了。因此,在本節概述中我會重點講解這個三個核心元件。其他元件會在本教程中各自章節分別介紹。

通道和緩衝區(Channels and Buffers)

通常來講,在 NIO 中所有的 IO 操作都開始於 ChannelChannel 就像位元組流一樣,資料可以從 Channel 讀取,然後寫到 Buffer 中。也可以從 Buffer 中讀取寫入到 Channel 中 。

Java NIO: Channels read data into Buffers, and Buffers write data into Channels

ChannelBuffer 有比較多的型別。下面列舉了在主要的幾種 Channel

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

如你所見,這些 Channel 覆蓋了 UDP + TCP 網路 IO ,以及檔案 IO。

伴隨著這些 Channel 還會有一些其他的比較有趣的介面,簡單起見,本章節暫不做介紹,我會在本系列教程的相關地方引入這些介面。

下面是 NIO 中核心 Buffer 實現類的列表。

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

這些 Buffer 涵蓋了可以通過 IO 傳送的基礎資料型別:byte, short, int, long, float, double and characters。

NIO 還有一個用於和記憶體對映檔案一起使用的 MappedByteBuffer,同樣本章節先不做介紹。

選擇器(Selectors)

選擇器允許單個的執行緒操作多個 Channel,如果你的應用是那種要開啟很多連線但是每個連線的資料傳輸量又比較低,這個特性是相當便利的。例如聊天伺服器。

下面是一個執行緒操作三個 Channel 的示意圖。

Java NIO: A Thread uses a Selector to handle 3 Channel's

使用 selector 之前你必須先把 Channel 註冊到 selector 上,之後你就可以呼叫它的 select() 方法,該方法是阻塞的,直到有一個 Channel 的狀態符合條件,方法返回後執行緒就可以處理接下來的流程。事件的示例有傳入連線,接受資料等等。

譯者注:如果你是第一次瞭解 NIO 的話,你可能會對這裡有些疑問。實際上是這個樣子的,Channel 註冊到 selector 上時會指定一個特定事件,選擇器會監聽該 Channel 上的特定事件,當特定事件滿足時,select() 方法就會返回。

相關文章