Java NIO 介紹
- NIO API 是對(duì) 1.3 版 I/O 特性的補(bǔ)充而非取代
- 新的 I/O 特性主要包含在 java.nio 軟件包及其子包中,并被命 名為 New I/O(NIO)
- 主要用來提升 Java 應(yīng) 用程序的 I/O 效率
Java NIO 的背景
Java 的劣勢(shì)源于其最大的優(yōu)勢(shì):一次編寫,到處運(yùn)行。Java 需要運(yùn)行于虛擬機(jī)(即 JVM)之 上,為了保證 Java 字節(jié)碼在各種 JVM 部署平臺(tái)上運(yùn)行效果一致,作些妥協(xié)是必須的.
雖然 Java 有一套完備的 I/O 類,但迄今 為止還只是針對(duì)通用特性,通常位于高端抽象層,橫跨各種操作系統(tǒng)。這些 I/O 類主要面向流數(shù) 據(jù),經(jīng)常為了處理個(gè)別字節(jié)或字符,就要執(zhí)行好幾個(gè)對(duì)象層的方法調(diào)用。
傳統(tǒng)Java I/O將不同的 I/O 對(duì)象組合到一起,提供了高度的靈活性,但需要處理 大量數(shù)據(jù)時(shí),卻可能對(duì)執(zhí)行效率造成致命傷害。I/O 的終極目標(biāo)是效率,而高效的 I/O 往往又無法 與對(duì)象形成一一對(duì)應(yīng)的關(guān)系。高效的 I/O 往往意味著您要選擇從 A 到 B 的最短路徑,而執(zhí)行大量 I/O 操作時(shí),復(fù)雜性毀了執(zhí)行效率。
當(dāng)移動(dòng)大量數(shù)據(jù)時(shí),這些 I/O 類可 伸縮性不強(qiáng),也沒有提供當(dāng)今大多數(shù)操作系統(tǒng)普遍具備的常用 I/O 功能,如文件鎖定、非塊 I/O、 就緒性選擇和內(nèi)存映射。這些特性對(duì)實(shí)現(xiàn)可伸縮性是至關(guān)重要的,對(duì)保持與非 Java 應(yīng)用程序的正 常交互也可以說是必不可少的,尤其是在企業(yè)應(yīng)用層面,而傳統(tǒng)的 Java I/O 機(jī)制卻沒有模擬這些通用 I/O 服務(wù)。
Java 規(guī)范請(qǐng)求#51 (JSR 51, http://jcp.org/jsr/detail/51.jsp)包含了對(duì)高速、可伸縮 I/O 特性的詳盡描述,借助這一特性,底層操作系統(tǒng)的 I/O 性能可以得到更好發(fā)揮, 這些促成了Java NIO的誕生。
隨著 Merlin 的發(fā)布,操作系統(tǒng)強(qiáng)大的 I/O 特性終于可以借助 Java 提供的工具得到充分發(fā)揮。 論及 I/O 性能,Java 再也不遜于任何一款編程語言。
預(yù)備知識(shí)
1.緩沖區(qū)(Buffers)
新的Buffer類是常規(guī)Java類和通道之間的紐帶。原始數(shù)據(jù)元素組成的固定長(zhǎng)度數(shù)組,封裝在包含狀態(tài)信息的對(duì)象中,存入緩沖區(qū)。緩沖區(qū)提供了一個(gè)會(huì)合點(diǎn):通道即可提取放在緩沖區(qū)中的數(shù)據(jù), 也可以向緩沖區(qū)存入數(shù)據(jù)供讀取。此外,還有一種特殊類型的緩沖區(qū),用于內(nèi)存映射文件。
2.通道(Channels)
NIO 新引入的最重要的抽象是通道的概念。Channel對(duì)象模擬了通道連接,通道既可以是單向的(進(jìn)或出),也可以是雙向的(進(jìn)和出)??梢园淹ǖ老胂蟪蛇B接緩沖區(qū)和I/O服務(wù)的捷徑。
3. 文件鎖定和內(nèi)存映射文件(File locking and memory-mapped files)
新的FileChannel類包含在java.nio.channels包內(nèi),提供了許多面向文件的新特性,其中最有趣的兩個(gè)是文件鎖定和內(nèi)存映射文件。
在多個(gè)進(jìn)程協(xié)同工作的情況下,要協(xié)調(diào)各個(gè)進(jìn)程對(duì)共享數(shù)據(jù)的訪問,文件鎖定是必不可少的工 具。
將文件映射到內(nèi)存,這樣在您看來,磁盤上的文件數(shù)據(jù)就像是在內(nèi)存中一樣。這利用了操作系 統(tǒng)的虛擬內(nèi)存功能,無需在內(nèi)存中實(shí)際保留一份文件的拷貝,就可實(shí)現(xiàn)文件內(nèi)容的動(dòng)態(tài)高速緩存。
4. 套接字(Sockets)
套接字通道類為使用網(wǎng)絡(luò)套接字實(shí)現(xiàn)交互提供了新方法。套接字通道可工作于非塊模式,并可 與選擇器一同使用。因此,多個(gè)套接字可實(shí)現(xiàn)多路傳輸,管理效率也比 java.net 提供的傳統(tǒng)套 接字更高。
三個(gè)新套接字通道,即 ServerSocketChannel、SocketChannel 和 DatagramChannel。
5. 選擇器(Selectors)
選擇器可實(shí)現(xiàn)就緒性選擇。 Selector 類提供了確定一或多個(gè)通道當(dāng)前狀態(tài)的機(jī)制。 使用選擇 器,借助單一線程,就可對(duì)數(shù)量龐大的活動(dòng) I/O 通道實(shí)施監(jiān)控和維護(hù)。
6. 字符集(Character sets)
java.nio.charsets 提供了新類用于處理字符與字節(jié)流之間的映射關(guān)系。您可以對(duì)字符轉(zhuǎn)
換映射方式進(jìn)行選擇,也可以自己創(chuàng)建映射。
參考文獻(xiàn)
- Java NIO (OReilly出版社)