1. 程式人生 > >Java提供了哪些IO方式?NIO如何實現複用?

Java提供了哪些IO方式?NIO如何實現複用?

一、Java提供了哪些IO方式?

Java IO方式由很多種,基於不同的IO抽象模型和互動方式,可以進行簡單區分。

首先,傳統的Java.IO包,它基於流模型實現,提供了我們最熟知的一些IO功能,比如File抽象、輸入輸出流等。互動方式是同步、阻塞的方式。也就是說,在讀取輸入流或者寫入輸出流時,在讀、寫動作完成之前,執行緒會一直阻塞在那裡,它們之間的呼叫時可靠的線性順序。
Java.io包的好處是程式碼比較簡單、直觀,缺點是IO效率和擴充套件性存在侷限性,容易成為應用效能的瓶頸。很多時候,人們也把Java.net下面提供的部分API,比如Socket、ServerSocket、HttpURLConnection也歸類到同步阻塞IO類庫,因為網路通訊同樣也是IO行為。
第二

,在Java 1.4中引入了NIO框架(Java.nio包),通過了Channel、Selector、Buffer等新的抽象,可以構建多路複用、同步非阻塞IO程式,同時提供了更接近作業系統底層的高效能資料操作方式。
第三、在Java 7中,NIO有了進一步的改進,也就是NIO 2,引入了非同步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。非同步IO操作基於事件和回撥機制,可以簡單理解為,應用操作直接返回,而不會阻塞在那裡,當後臺處理完成,作業系統會通知相應執行緒進行後續工作。

基本概念:

 同步和非同步(synchronous/asynchronous)。簡單來說,同步是一種可靠的有序執行機制、當我們進行同步操作時,後續的任務是等待當前呼叫返回,才會進行下一步;而非同步相反,其他任務不需要等待當前呼叫返回,通常依靠事件、回撥等機制來實現任務間次序關係
阻塞與非阻塞(blocking/non-blocking)。

在進行阻塞操作時,當前執行緒會處於阻塞狀態,無法從事其他任務,只有當條件就緒才能繼續。比如ServerSocket新連線建立完畢,或資料讀取,寫入操作完成;而非阻塞則是不管IO操作是否結束,直接返回,相應操作在後臺繼續處理。
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
在這裡插入圖片描述
在這裡插入圖片描述