JAVA NIO(一)概述

1.簡介

Java NIO(New IO | NON-Blocking IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),NIO與原來的IO有同樣的作用和目的,但Java NIO提供了與標準IO不同的IO工作方式。
    Java NIO系統的核心在於:通道(Channel)和緩衝區(Buffer)。通道表示打開到 IO 設備(例如:文件、套接字)的連接。若需要使用 NIO 系統,需要獲取用於連接 IO 設備的通道以及用於容納數據的緩衝區。然後操作緩衝區,對數據進行處理。
    簡而言之,Channel 負責傳輸, Buffer 負責存儲。

2.概念

Java NIO: Channels and Buffers(通道和緩衝區) 
標準的IO基於字節流和字符流進行操作的,而NIO是基於通道(Channel)和緩衝區(Buffer)進行操作,數據總是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中。
Java NIO: Non-blocking IO(非阻塞IO) 
Java NIO可以讓你非阻塞的使用IO,例如:當線程從通道讀取數據到緩衝區時,線程還是可以進行其他事情。當數據被寫入到緩衝區時,線程可以繼續處理它。從緩衝區寫入通道也類似。
Java NIO: Selectors(選擇器) 
Java NIO引入了選擇器的概念,選擇器用於監聽多個通道的事件(比如:連接打開,數據到達)。因此,單個的線程可以監聽多個數據通道。

3. NIO 與傳統IO 的區別:

IO:面向流;阻塞式 IO;單向。
NIO:面向緩衝區;非阻塞IO;選擇器;雙向。(好處:更加高效,數據的處理更加多樣化)

面向流:Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的數據,需要先將它緩存到一個緩衝區。  

面向緩衝區:Java NIO的緩衝導向方法略有不同。數據讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩衝區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩衝區時,不要覆蓋緩衝區裏尚未處理的數據。

4. 阻塞與非阻塞:

是針對於網絡通訊而言。應用程序在獲取網絡數據的時候,根據IO操作的就緒狀態來採取的不同方式。說白了是一種讀取或者寫入操作函數的實現方式。
(運行一個應用程序,就啓動了一個用戶進程,操作系統的核心是內核進程)
阻塞:應用程序在獲取網絡數據的時候,如果網絡傳輸數據很慢,那麼程序就一直等着,知道傳輸完畢爲止。
非阻塞:應用程序直接獲取數據無需等待。讀取或者寫入函數會立即返回一個狀態值。

5. 同步與異步:

是針對應用程序和內核的交互而言的。
同步:用戶進程觸發IO操作並等待或者輪詢的去查看IO操作是否就緒。即應用程序直接參與 IO讀寫。
異步:用戶進程觸發IO操作以後便開始做自己的事情,IO操作交由內核進程完成,而當IO操作已完成的時用戶進程會得到內核進程 IO完成的通知。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章