摘要:線程之間的切換對于操作系統(tǒng)來說是昂貴的。因此,單線程可以監(jiān)視多個通道中的數(shù)據(jù)。當(dāng)方法返回后,線程可以處理這些事件。
一 NIO簡介
Java NIO 是 java 1.4 之后新出的一套IO接口,這里的的新是相對于原有標(biāo)準(zhǔn)的Java IO和Java Networking接口。NIO提供了一種完全不同的操作方式。
NIO中的N可以理解為Non-blocking,不單純是New。
它支持面向緩沖的,基于通道的I/O操作方法。 隨著JDK 7的推出,NIO系統(tǒng)得到了擴展,為文件系統(tǒng)功能和文件處理提供了增強的支持。 由于NIO文件類支持的這些新的功能,NIO被廣泛應(yīng)用于文件處理。
二 NIO的特性/NIO與IO區(qū)別1 Channels and Buffers(通道和緩沖區(qū))
IO是面向流的,NIO是面向緩沖區(qū)的
標(biāo)準(zhǔn)的IO編程接口是面向字節(jié)流和字符流的。而NIO是面向通道和緩沖區(qū)的,數(shù)據(jù)總是從通道中讀到buffer緩沖區(qū)內(nèi),或者從buffer緩沖區(qū)寫入到通道中;( NIO中的所有I/O操作都是通過一個通道開始的。)
Java IO面向流意味著每次從流中讀一個或多個字節(jié),直至讀取所有字節(jié),它們沒有被緩存在任何地方;
Java NIO是面向緩存的I/O方法。 將數(shù)據(jù)讀入緩沖器,使用通道進一步處理數(shù)據(jù)。 在NIO中,使用通道和緩沖區(qū)來處理I/O操作。
2 Non-blocking IO(非阻塞IO)
IO流是阻塞的,NIO流是不阻塞的。
Java NIO使我們可以進行非阻塞IO操作。比如說,單線程中從通道讀取數(shù)據(jù)到buffer,同時可以繼續(xù)做別的事情,當(dāng)數(shù)據(jù)讀取到buffer中后,線程再繼續(xù)處理數(shù)據(jù)。寫數(shù)據(jù)也是一樣的。另外,非阻塞寫也是如此。一個線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。
Java IO的各種流是阻塞的。這意味著,當(dāng)一個線程調(diào)用read() 或 write()時,該線程被阻塞,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情了
3 Selectors(選擇器)
NIO有選擇器,而IO沒有。
選擇器用于使用單個線程處理多個通道。因此,它需要較少的線程來處理這些通道。
線程之間的切換對于操作系統(tǒng)來說是昂貴的。 因此,為了提高系統(tǒng)效率選擇器是有用的。
三 讀數(shù)據(jù)和寫數(shù)據(jù)方式通常來說NIO中的所有IO都是從 Channel(通道) 開始的。
從通道進行數(shù)據(jù)讀取 :創(chuàng)建一個緩沖區(qū),然后請求通道讀取數(shù)據(jù)。
從通道進行數(shù)據(jù)寫入 :創(chuàng)建一個緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。
數(shù)據(jù)讀取和寫入操作圖示:
四 NIO核心組件簡單介紹NIO包含下面幾個核心的組件:
Channels
Buffers
Selectors
整個NIO體系包含的類遠(yuǎn)遠(yuǎn)不止這三個,只能說這三個是NIO體系的“核心API”。
通道
在Java NIO中,主要使用的通道如下(涵蓋了UDP 和 TCP 網(wǎng)絡(luò)IO,以及文件IO):
DatagramChannel
SocketChannel
FileChannel
ServerSocketChannel
緩沖區(qū)
在Java NIO中使用的核心緩沖區(qū)如下(覆蓋了通過I/O發(fā)送的基本數(shù)據(jù)類型:byte, char、short, int, long, float, double ,long):
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
FloatBuffer
DoubleBuffer
LongBuffer
選擇器
Java NIO提供了“選擇器”的概念。這是一個可以用于監(jiān)視多個通道的對象,如數(shù)據(jù)到達,連接打開等。因此,單線程可以監(jiān)視多個通道中的數(shù)據(jù)。
如果應(yīng)用程序有多個通道(連接)打開,但每個連接的流量都很低,則可考慮使用它。 例如:在聊天服務(wù)器中。
下面是一個單線程中Slector維護3個Channel的示意圖:
要使用Selector的話,我們必須把Channel注冊到Selector上,然后就可以調(diào)用Selector的select()方法。這個方法會進入阻塞,直到有一個channel的狀態(tài)符合條件。當(dāng)方法返回后,線程可以處理這些事件。
參考:官方JDK相關(guān)文檔
谷歌搜索排名第一的Java NIO教程
Java NIO 與 IO之間的區(qū)別
《Java程序員修煉之道》
歡迎關(guān)注我的微信公眾號:"Java面試通關(guān)手冊"(一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源):
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69379.html
摘要:從通道進行數(shù)據(jù)寫入創(chuàng)建一個緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來了,便于大家學(xué)習(xí)與回顧。 Ja...
摘要:返回一個路徑,該路徑是冗余名稱元素的消除。本節(jié)教程將覆蓋大部分方法。在本例中,這個數(shù)組內(nèi)包含了,表示檢測時不包含符號鏈接文件。遍歷整個文件目錄接受一個和作為參數(shù)。 Java面試通關(guān)手冊(Java學(xué)習(xí)指南)github地址(歡迎star和pull):https://github.com/Snailclimb/Java_Guide 歷史回顧: Java NIO 概覽 Java NIO 之 ...
摘要:通道可以異步讀寫。使用的方法讀取數(shù)據(jù)創(chuàng)建一個讀數(shù)據(jù)緩沖區(qū)對象從通道中讀取數(shù)據(jù)使用的方法寫入數(shù)據(jù)創(chuàng)建一個寫數(shù)據(jù)緩沖區(qū)對象寫入數(shù)據(jù)關(guān)閉完成使用后,您必須關(guān)閉它。五提供了一種被稱為的新功能,也稱為本地矢量。功能是通道提供的并不是。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) 其他高贊文章: 面試中關(guān)于Redis的問題看這篇就夠了 一文輕松搞懂redis集...
摘要:抽象類有一個方法用于使通道處于阻塞模式或非阻塞模式。注意抽象類的方法是由抽象類實現(xiàn)的,都是直接繼承了抽象類。大家有興趣可以看看的源碼,各種抽象類和抽象類上層的抽象類。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) Java NIO 之 Channel(通道) 其他高贊文章: 面試中關(guān)于Redis的問題看這篇就夠了 一文輕松搞懂redis集群原理及搭建...
摘要:豐富的緩存數(shù)據(jù)結(jié)構(gòu)使用它自己的緩存來表示字節(jié)序列而不是的。針對有一個定義良好的事件模型。有一些協(xié)議是多層的建立在其他低級協(xié)議基礎(chǔ)上。此外,甚至不是完全線程安全的。協(xié)議由標(biāo)準(zhǔn)化為。協(xié)議緩存整合是一個高效二進制協(xié)議的快速實現(xiàn)。 Chapter 2、結(jié)構(gòu)概覽 這一節(jié)我們將確認(rèn)Netty提供的核心功能是什么,以及它們怎么構(gòu)成一個完整的網(wǎng)絡(luò)應(yīng)用開發(fā)堆棧。 1、豐富的緩存數(shù)據(jù)結(jié)構(gòu) Netty使用它...
閱讀 3141·2023-04-26 02:33
閱讀 3102·2023-04-25 21:33
閱讀 907·2021-09-02 09:56
閱讀 2910·2019-08-30 15:44
閱讀 2460·2019-08-30 13:15
閱讀 1034·2019-08-30 13:04
閱讀 1634·2019-08-29 15:09
閱讀 3956·2019-08-26 18:26