1、java 中提供了那些IO方式?NIO如何實現多路複用?java
java IO 方式有不少種,基於不一樣的IO抽象模型和交互方式,進行簡單區分。編程
java.io 包得好處是代碼比較簡單、直觀、缺點是IO效率和擴展性存在侷限性,容易成爲使用時應用性能的瓶頸。網絡
不少時候,人們把java.net 下面提供的部分網絡API,好比Socke、ServerSocket、HttpURLConnection 也歸類到同步阻塞IO類庫,由於網絡通訊一樣是IO行爲。框架
第二,在java1.4中引入了NIO框架(java.nio包),提供了Channel、Selector、Buffer等新抽象,能夠構建多路複用、同步非阻塞IO程序,同時提供了更接近操做系統的高性能數據操做方式。異步
第三,在java7 中,NIO有了進一步改進,也叫NIO2,引入了異步非阻塞的方式,也叫AIO(Asynchronous IO),異步操做基於事件和回調機制,簡單理解爲,應用操做直接返回,不會阻塞在那裏,當後臺處理完成時,操做系統會通知相應線程進行後續工做。性能
知識擴展:編碼
首先澄清一些基本概念:spa
。區分同步異步(synchronous/asynchronous),簡單說就是,同步是一種可靠地有序運行機制,當咱們進行同步操做時,後續任務是等待當前調用返回,纔會進行下一步;異步則相反,其餘任務不須要等待當前調用返回,一般依靠事件、回調等機制來實現任務間次序關係操作系統
。區分阻塞非阻塞,當進行阻塞操做時,當前線程會出於阻塞狀態,沒法從事其餘任務,只有當條件就緒才能繼續,好比ServerSocket 新鏈接創建完畢,或數據讀取、寫入操做完成;而非阻塞則無論IO操做是否結束,直接返回,響應操做在後臺完成。.net
這裏還須要理解:
。IO不單單是對文件的操做,在網絡編程中,好比Socket 通訊,都是典型的IO操做目標;
。Reader/Writer則用於操做字符,增長字符編碼等功能,適用於相似從文件中讀取或者寫入文本信息,本質上計算機操做的都是字節,無論是網絡通訊仍是文件讀取,Reader/writer 至關於構建了應用邏輯和原始數據之間的橋樑。
。BufferedOutputStream 等帶緩衝區的實現,能夠避免頻繁的磁盤讀寫,進而提升IO處理效率。這種設計利用了緩衝區,將批量數據進行了一次操做,但在使用中千
萬不要忘了flush.
.---------------------------------------------未完待續的分割線-----------------------------------------------------------