官术网_书友最值得收藏!

1.2 Java的I/O演進

在JDK 1.4推出Java NIO之前,基于Java的所有Socket通信都采用了同步阻塞模式(BIO),這種一請求一應(yīng)答的通信模型簡化了上層的應(yīng)用開發(fā),但是在性能和可靠性方面卻存在著巨大的瓶頸。因此,在很長一段時間里,大型的應(yīng)用服務(wù)器都采用C或者C++語言開發(fā),因為它們可以直接使用操作系統(tǒng)提供的異步I/O或者AIO能力。當并發(fā)訪問量增大、響應(yīng)時間延遲增大之后,采用Java BIO開發(fā)的服務(wù)端軟件只有通過硬件的不斷擴容來滿足高并發(fā)和低時延,它極大地增加了企業(yè)的成本,并且隨著集群規(guī)模的不斷膨脹,系統(tǒng)的可維護性也面臨巨大的挑戰(zhàn),只能通過采購性能更高的硬件服務(wù)器來解決問題,這會導(dǎo)致惡性循環(huán)。

正是由于Java傳統(tǒng)BIO的拙劣表現(xiàn),才使得Java支持非阻塞I/O的呼聲日漸高漲,最終,JDK1.4版本提供了新的NIO類庫,Java終于也可以支持非阻塞I/O了。

Java的I/O發(fā)展簡史

從JDK1.0到JDK1.3,Java的I/O類庫都非常原始,很多UNIX網(wǎng)絡(luò)編程中的概念或者接口在I/O類庫中都沒有體現(xiàn),例如Pipe、Channel、Buffer和Selector等。2002年發(fā)布JDK1.4時,NIO以JSR-51的身份正式隨JDK發(fā)布。它新增了個java.nio包,提供了很多進行異步I/O開發(fā)的API和類庫,主要的類和接口如下。

◎ 進行異步I/O操作的緩沖區(qū)ByteBuffer等;

◎ 進行異步I/O操作的管道Pipe;

◎ 進行各種 I/O 操作(異步或者同步)的 Channel,包括 ServerSocketChannel 和SocketChannel;

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

◎ 實現(xiàn)非阻塞I/O操作的多路復(fù)用器selector;

◎ 基于流行的Perl實現(xiàn)的正則表達式類庫;

◎ 文件通道FileChannel。

新的NIO類庫的提供,極大地促進了基于Java的異步非阻塞編程的發(fā)展和應(yīng)用,但是,它依然有不完善的地方,特別是對文件系統(tǒng)的處理能力仍顯不足,主要問題如下。

◎ 沒有統(tǒng)一的文件屬性(例如讀寫權(quán)限);

◎ API能力比較弱,例如目錄的級聯(lián)創(chuàng)建和遞歸遍歷,往往需要自己實現(xiàn);

◎ 底層存儲系統(tǒng)的一些高級API無法使用;

◎ 所有的文件操作都是同步阻塞調(diào)用,不支持異步文件讀寫操作。

2011年7月28日,JDK1.7正式發(fā)布。它的一個比較大的亮點就是將原來的NIO類庫進行了升級,被稱為NIO2.0。NIO2.0由JSR-203演進而來,它主要提供了如下三個方面的改進。

◎ 提供能夠批量獲取文件屬性的API,這些API具有平臺無關(guān)性,不與特性的文件系統(tǒng)相耦合,另外它還提供了標準文件系統(tǒng)的SPI,供各個服務(wù)提供商擴展實現(xiàn);

◎ 提供AIO功能,支持基于文件的異步I/O操作和針對網(wǎng)絡(luò)套接字的異步操作;

◎ 完成JSR-51定義的通道功能,包括對配置和多播數(shù)據(jù)報的支持等。

主站蜘蛛池模板: 石屏县| 房产| 湘潭市| 莲花县| 随州市| 东至县| 特克斯县| 闸北区| 惠来县| 阿荣旗| 南雄市| 宣汉县| 潮安县| 霍林郭勒市| 常熟市| 察哈| 那坡县| 太原市| 邢台市| 广安市| 水富县| 平湖市| 万宁市| 哈密市| 义乌市| 莆田市| 调兵山市| 淳化县| 二连浩特市| 中方县| 定安县| 九龙县| 永善县| 来凤县| 曲松县| 杭州市| 三河市| 万山特区| 绥中县| 桐柏县| 岱山县|