Java提供了哪些IO方式?NIO如何實現複用?
一、Java提供了哪些IO方式?
Java IO方式由很多種,基於不同的IO抽象模型和互動方式,可以進行簡單區分。
首先,傳統的Java.IO包,它基於流模型實現,提供了我們最熟知的一些IO功能,比如File抽象、輸入輸出流等。互動方式是同步、阻塞的方式。也就是說,在讀取輸入流或者寫入輸出流時,在讀、寫動作完成之前,執行緒會一直阻塞在那裡,它們之間的呼叫時可靠的線性順序。
Java.io包的好處是程式碼比較簡單、直觀,缺點是IO效率和擴充套件性存在侷限性,容易成為應用效能的瓶頸。很多時候,人們也把Java.net下面提供的部分API,比如Socket、ServerSocket、HttpURLConnection也歸類到同步阻塞IO類庫,因為網路通訊同樣也是IO行為。
第二
第三、在Java 7中,NIO有了進一步的改進,也就是NIO 2,引入了非同步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。非同步IO操作基於事件和回撥機制,可以簡單理解為,應用操作直接返回,而不會阻塞在那裡,當後臺處理完成,作業系統會通知相應執行緒進行後續工作。
基本概念:
同步和非同步(synchronous/asynchronous)。簡單來說,同步是一種可靠的有序執行機制、當我們進行同步操作時,後續的任務是等待當前呼叫返回,才會進行下一步;而非同步相反,其他任務不需要等待當前呼叫返回,通常依靠事件、回撥等機制來實現任務間次序關係
阻塞與非阻塞(blocking/non-blocking)。
IO多路複用。IO指的就是我們網路IO,多路指多個TCP連線(或多個Channel),複用指複用一個或少量執行緒。串起來就是很多個網路IO複用一個或少量的執行緒來處理這些連線。
二、IO和NIO的區別
IO | NIO |
---|---|
面向流 | 面向緩衝區 |
阻塞IO | 非阻塞IO |
一個執行緒處理一個連線 | 單執行緒管理多個連線 |
1.面向流與面向緩衝
2.阻塞與非阻塞
3.單個連線與多個連線
1>Java NIO:單執行緒管理多個連線
NIO可以使用一個或幾個執行緒管理多個通道(網路連線或檔案),但付出的代價是解析資料可能會比從一個阻塞流中讀取資料更復雜。
如果需要管理同時開啟的成千上萬個連線,這些連線每次只是傳送少量的資料,例如聊天伺服器,實現NIO的伺服器是一個優勢。同時,如果你需要維持許多開啟的連線到其他計算機上。如P2P網路中,使用一個單獨的執行緒來管理你的所有出站連線。
2>Java IO:一個連線通過一個執行緒處理
如果有少量的連線使用非常高的頻寬,一次傳送大量的資料,典型的IO伺服器實現更加契合。
三、NIO如何實現多路複用?
NIO核心元件:Channel,Buffer,Selector
1.Buffer:
Java NIO BUffer用於和NIO Channel互動。我們從Channel中讀取資料到buffer裡,從buffer把資料寫入到channel;
buffer本質上就是一塊記憶體區
2.Channel
通常來說NIO中的所有IO都是從Channel(通道)開始的
3.Selector
Selector一般稱為選擇器,也稱為多路複用器。它是Java NIO核心元件中的一個,用於檢查一個或多個NIO Channel的狀態是否處於可讀、可寫。因此可以實現單執行緒管理多個Channel