1. 程式人生 > >Java I/O 進化之路

Java I/O 進化之路

  • 在正式學習 Java NIO 之前,有必要先了解 Java 的整個 I/O 框架演進過程!

Java I/O 基礎

  • Java JDK 1.4 推出 Java NIO 之前,基於 Java 的所有 Socket 通訊都採用了同步阻塞IO(Blocking IO—BIO),這種一請求一應答的通訊模型簡化了上層的應用開發,但是在效能和可靠性方面卻存在著巨大的瓶頸。平時使用的 TCP 程式設計就是典型的 BIO 模型!
  • BIO(Blocking IO)方式導致開發人員在開發高效能的 I/O 程式時,會面臨一些巨大的挑戰與困難,主要問題如下:

1)沒有資料緩衝區,I/O 效能存在問題

2)沒有 C 或者 C++ 中的 Channel(通道)概念,只有輸入和輸出流

3)同步阻塞式 I/O 通訊(BIO—Blocking IO),通常會導致通訊執行緒被長時間則塞

4)支援的字符集有限,硬體可移植性不好

  • 於是在 Java 支援非同步 I/O 之前的很長一段時間內,高效能伺服器開發領域一直被 C++ 和 C 語言長期佔據,因為它們可以直接使用作業系統提供的非同步 I/O(AIO) 能力。
  • 當併發訪問量增大、響應時間延遲增大之後,採用 Java BIO (Blocking IO
    )開發的伺服器軟體只能通過硬體的不斷擴容來滿足高併發和低延遲,這極大地增加了企業的成本,並且隨著叢集規模的不斷膨脹,系統的可維護性也面臨巨大的挑戰,只能通過採購效能更高的硬體伺服器來解決問題,這就導致了惡性迴圈。
  • 正式由於 Java 傳統 BIO (Blocking IO) 的拙劣表現,最終在 Java JDK 1.4 版本提供了新的 NIO(New IO) 類庫,Java 也終於開始支援非阻塞 I/O。

Java NIO 發展簡史

  • Java JDK 從 1.0 到 1.3,Java 的 I/O 類庫都非常原始,很多 Unix 網路程式設計中的概念或者介面在 I/O 類庫中都沒有體現,例如 Pipe、Channel、Buffer、Selector 等。
  • 2002 年釋出 Java JDK 1.4 時,NIO(New IO) 以 JSR-51 的身份正式隨 JDK 釋出,新增了 java.nio 包,提供了很多進行非同步 I/O 開發的 API 和類庫,主要的類和介面如下:

1)進行非同步 I/O 操作的緩衝區 ByteBuffer 等

2)支援非同步 I/O 操作的管道 Pipe

3)進行各種 I/O 操作(非同步或者同步)的 Channel ,包括 ServerSocketChannel、SocketChannel

4)多種字符集的編碼能力和解碼能力;

5)實現非阻塞 I/O 操作的多路複用器 Selector

6)基於流行的 Perl 實現的正則表示式類庫

6)檔案通道 FileChannel

  • JDK 1.4 新增的 NIO (New IO)類庫極大地促進了基於 Java 的非同步非則塞程式設計的發展與應用,但是仍然有不完善的地方,特別是對檔案系統的處理能力不足,主要問題如下:

1)沒有統一的檔案屬性(例如讀寫許可權)

2)API 能力比較弱,例如目錄的級聯建立和遞迴遍歷,往往需要自己實現

3)底層儲存系統的一些高階 API 無法使用

4)所有的檔案操作都是同步則塞呼叫,不支援非同步檔案讀寫操作

  • 2011 年 7 月 28 日,Java JDK 1.7 正式釋出,它的一大亮點就是將原來的 NIO(New IO) 類庫進行了升級,被稱為 NIO2.0。NIO2.0 由 JSR-203 演進而來,它主要提供瞭如下方面的改進:

1)提供了能夠批量獲取檔案屬性的 API,這些 API 具有平臺無關性,不與特定的檔案系統耦合。另外還提供了標準的檔案系統的 SPI (Serial Peripheral Interface—序列外設介面),供各種服務提供商擴充套件實現

2)提供 AIO( Asynchronous IO—非同步非阻塞IO)功能,支援基於檔案的非同步IO操作和針對網路套接字的非同步操作

3)完成 JSR-52 定義的通道功能,包括對配置和多播資料報的支援等