Java NIO 學習:概述

  Java 在 I/O 領域一直處於劣勢,這種狀況直到 J2SE SDK 發佈了 1.4 版之後纔有了改觀。 Java 的劣勢源於其最大的優點:一次編寫,處處運行。 Java 須要運行於虛擬機(即 JVM)之上,爲了保證 Java 字節碼在各類 JVM 部署平臺上運行效果一致,做些妥協是必須的。既然須要通用於不一樣的操做系統平臺,那麼,某種程度上就必須選擇各類平臺都接受的處理方案。java

  最切實地感覺到妥協帶來的後果的,莫過於 I/O 領域。雖然 Java 有一套完備的 I/O 類,但迄今爲止還只是針對通用特性,一般位於高端抽象層,橫跨各類操做系統。這些 I/O 類主要面向流數據,常常爲了處理個別字節或字符,就要執行好幾個對象層的方法調用。正則表達式

  這種面向對象的處理方法,將不一樣的 I/O 對象組合到一塊兒,提供了高度的靈活性,但須要處理大量數據時,卻可能對執行效率形成致命傷害。 I/O 的終極目標是效率,而高效的 I/O 每每又沒法與對象造成一一對應的關係。高效的 I/O 每每意味着您要選擇從 A 到 B 的最短路徑,而執行大量I/O 操做時,複雜性毀了執行效率。express

  傳統 Java 平臺上的 I/O 抽象工做良好,適應用途普遍。可是當移動大量數據時,這些 I/O 類可伸縮性不強,也沒有提供當今大多數操做系統廣泛具有的經常使用 I/O 功能,如文件鎖定、非塊 I/O、就緒性選擇和內存映射。這些特性對實現可伸縮性是相當重要的,對保持與非 Java 應用程序的正常交互也能夠說是必不可少的,尤爲是在企業應用層面,而傳統的 Java I/O 機制卻沒有模擬這些通用 I/O 服務。數組

  Java New I/O( NIO) ——就是這樣一項提議的產物。 Java 規範請求#51( JSR 51, http://jcp.org/jsr/detail/51.jsp)包含了對高速、可伸縮 I/O 特性的詳盡描述,藉助這一特性,底層操做系統的 I/O 性能能夠獲得更好發揮。 JSR 51 的實現,其結果就是新增類組合到一塊兒,構成了 java.nio 及其子包,以及 java.util.regex 軟件包,同時現存軟件包也相應做了幾處修改。緩存

  如下概要,是專門爲那些火燒眉毛往前趕的人準備的。網絡

緩衝區( Buffers

  新的 Buffer 類是常規 Java 類和通道之間的紐帶。原始數據元素組成的固定長度數組,封裝在包含狀態信息的對象中,存入緩衝區。緩衝區提供了一個會合點:通道既可提取放在緩衝區中的數據(寫),也可向緩衝區存入數據供讀取(讀)。此外,還有一種特殊類型的緩衝區,用於內存映射文件。app

通道( Channels

  NIO 新引入的最重要的抽象是通道的概念。 Channel 對象模擬了通訊鏈接,管道既能夠是單向的(進或出),也能夠是雙向的(進和出)。能夠把通道想象成鏈接緩衝區和 I/O 服務的捷徑。某些狀況下,軟件包中的舊類可利用通道。爲了可以向與文件或套接字關聯的通道進行存取,適當的地方都增長了新方法。多數通道可工做在非塊模式下,這意味着更好的可伸縮性,尤爲是與選擇器一同使用的時候。jsp

文件鎖定和內存映射文件( File locking and memory-mapped files

  新的 FileChannel 對象包含在 java.nio.channels 軟件包內,提供許多面向文件的新特性,其中最有趣的兩個是文件鎖定和內存映射文件。在多個進程協同工做的狀況下,要協調各個進程對共享數據的訪問,文件鎖定是必不可少的工具。將文件映射到內存,這樣在您看來,磁盤上的文件數據就像是在內存中同樣。這利用了操做系統的虛擬內存功能,無需在內存中實際保留一份文件的拷貝,就可實現文件內容的動態高速緩存。工具

套接字( Sockets

  套接字通道類爲使用網絡套接字實現交互提供了新方法。套接字通道可工做於非塊模式,並可與選擇器一同使用。所以,多個套接字可實現多路傳輸,管理效率也比 java.net 提供的傳統套接字更高。三個新套接字通道,即 ServerSocketChannelSocketChannel DatagramChannel。性能

選擇器( Selectors

  選擇器可實現就緒性選擇。 Selector 類提供了肯定一或多個通道當前狀態的機制。使用選擇器,藉助單一線程,就可對數量龐大的活動 I/O 通道實施監控和維護。

正則表達式( Regular expressions

  新增的 java.util.regex 軟件包將相似 Perl 語言的正則表達式處理機制引入 Java。這一人們期盼已久的特性有着普遍用途。新的正則表達式 API 之因此被當作是 NIO 的組成部分,是因 JSR 51 把它與其餘 NIO 特性放在一塊兒做了詳細說明。雖然它在許多方面與 NIO 的其餘組成部分缺少平行關係,但它在文件處理等衆多領域都是極其有用的。

字符集( Character sets

  java.nio.charsets 提供了新類用於處理字符與字節流之間的映射關係。 您能夠對字符轉換映射方式進行選擇,也能夠本身建立映射。

相關文章
相關標籤/搜索