轉載請注明出處:http://www.cnblogs.com/Joanna-Yan/p/7419117.html
JDK1.4之前的早期版本,Java對I/O的支持並不完善,開發人員在開發高性能I/O程序的時候,會面臨一些巨大的挑戰和困難,主要問題如下:
- 沒有數據緩沖區,I/O性能存在問題;
- 沒有C或者C++中的Channel概念,只有輸入和輸出流;
- 同步阻塞式I/O通信(BIO),通常會導致通信線程被長時間阻塞;
- 支持的字符集有限,硬件可移植性不好。
在Java支持異步I/O之前的很長一段時間里,高性能服務端開發領域一直被C++和C長期占據,Java的同步阻塞I/O被大家所詬病。
在JDK1.4推出Java NIO之前,基於Java的所有Socket通信都采用了同步阻塞模式(BIO),這種一請求一應答的通信模型簡化了上層的應用開發,但是在性能和可靠性方面卻存在着巨大的瓶頸。因此,在很長一段時間里,大型的應用服務器都采用C或者C++語言開發,因為它們可以直接使用操作系統提供的異步I/O或者AIO能力。當並發訪問量增大、響應時間延遲增大之后,采用Java BIO開發的服務端軟件只有通過硬件的不斷擴容來滿足高並發和延時,極大地增加了企業的成本,並且隨着集群規模的不斷膨脹,系統的可維護性也面臨巨大的挑戰,只能通過采購性能更高的硬件服務器來解決問題,這會導致惡性循環。
正是由於Java傳統BIO的拙劣表現,才使得Java支持非阻塞I/O的呼聲日漸高漲,最終,JDK1.4版本提供了新的NIO類庫,Java終於也可以支持非阻塞I/O了。
JDK1.4推出 NIO 1.0 。新增java.nio包,提供了很多進行異步I/O開發的API和類庫,主要的類和接口如下。
- 進行異步I/O操作的緩沖區ByteBuffer等;
- 進行異步I/O操作的管道Pipe;
- 進行各種I/O操作(異步或者同步)的Channel,包括ServerSocketChannel和SocketChannel;
- 多種字符集的編碼能力和解碼能力;
- 實現非阻塞I/O操作的多路復用器selector;
- 基於流行的Perl實現的正則表達式類庫;
- 文件通道FileChannel。
新的NIO類庫的提供,極大地促進了基於Java的異步非阻塞編程的發展和應用,但是,它依然有不完善的地方,特別是對文件系統的處理能力仍顯不足,主要問題如下。
- 沒有統一的文件屬性(例如讀寫權限);
- API能力比較弱,例如目錄的級聯創建和遞歸遍歷,往往需要自己實現;
- 底層存儲系統的一些高級API無法使用;
- 所有的文件操作都是同步阻塞調用,不支持異步文件讀寫操作。
JDK1.7推出 NIO 2.0。主要提供了如下三個方面的改進。
- 提供能夠批量獲取文件屬性的API,這些API具有平台無關性,不與特性的文件系統相耦合,另外它還提供了標准文件系統的SPI,供各個服務商擴展實現;
- 提供AIO功能,支持基於文件的異步I/O操作和針對網絡套接字的異步操作;
- 完成JSR定義的通道功能,包括對配置和多播數據報的支持等。
到目前為止大家對Java的I/O演進有了一個更加直觀的認識。后面將會對阻塞I/O和非阻塞I/O進行詳細講解,同時給出代碼示例。大家就能夠對傳統的阻塞I/O的弊端和非阻塞I/O的優點有更加深刻的體會。
如果此文對您有幫助,微信打賞我一下吧~